Установить значение по умолчанию для django ModelChoiceField - PullRequest
0 голосов
/ 26 марта 2019

Мне нужно установить значение по умолчанию для ModelChoiceField

Значение отправляется с моего views.py.

Я искал некоторые другие подобные вопросы, но это не помогло, поскольку все было о ChoiceField с choices, а не ModelChoiceField с queryset

views.py

def edit_package(request, pk):
    current_package = get_object_or_404(models.Package, pk=pk)
    edit_package_form = forms.EditPackageForm(request.POST, name=current_package.package_name,
                                              teacher=current_package.package_teacher_name,
                                              level=current_package.package_level,
                                              subject=current_package.package_subject,
                                              price=current_package.package_price)
    if request.method == 'POST':
        if edit_package_form.is_valid():
            pass
        else:
            edit_package_form = forms.EditPackageForm(request.POST, name=current_package.package_name,
                                                      teacher=current_package.package_teacher_name,
                                                      level=current_package.package_level,
                                                      subject=current_package.package_subject,
                                                      price=current_package.package_price)
    context = {
        'current_package': current_package,
        'edit_package_form': edit_package_form,
    }
    return render(request, 'edit_package.html', context)

forms.py

class EditPackageForm(forms.Form):
    def __init__(self, *args, **kwargs):
        current_name = kwargs.pop("name")  
        current_teacher = kwargs.pop("teacher")  
        current_level = kwargs.pop("level")  
        current_subject = kwargs.pop("subject")  
        current_price = kwargs.pop("price")  

        super(EditPackageForm, self).__init__(*args, **kwargs)
        self.fields['package_name'] = forms.CharField(
            widget=forms.TextInput(attrs={'class': 'form-control', 'value': current_name}))
        self.fields['teacher_name'] = forms.ModelChoiceField(queryset=models.Teacher.objects.all(),
                                                             initial=current_teacher,
                                                             widget=forms.Select(attrs={'class': 'form-control'}),
                                                             required=False)
        self.fields['level_name'] = forms.ModelChoiceField(queryset=models.Level.objects.all(),
                                                           initial=current_level,
                                                           widget=forms.Select(attrs={'class': 'form-control'}),
                                                           required=False)
        self.fields['subject_name'] = forms.ModelChoiceField(queryset=models.Subject.objects.all(),
                                                             initial=current_subject,
                                                             widget=forms.Select(attrs={'class': 'form-control'}),
                                                             required=False)
        self.fields['package_price'] = forms.IntegerField(
            widget=forms.NumberInput(attrs={'class': 'form-control', 'value': current_price}))

И вот как это выглядит, TextInput и NumberInput имеют значение по умолчанию, но initial не работает с ModelChoiceField

Screen_shot

1 Ответ

2 голосов
/ 26 марта 2019

Например, в ModelChoiceField для имени учителя вы отправляете имя из представления, что является неправильным, поскольку вы должны отправить идентификатор учителя в форму и этот идентификатор назначить его в начале. То же самое должно быть сделано с остальными.

edit_package_form = forms.EditPackageForm(request.POST, name=current_package.package_name,
                                          teacher=current_package.package_teacher_id,
                                          level=current_package.package_level_id,
                                          subject=current_package.package_subject_id,
                                          price=current_package.package_price)
...