为 django ModelChoiceField 设置默认值

Set Default value for a django ModelChoiceField

我需要为 ModelChoiceField

设置默认值

正在从我的 views.py 发送值。

我已经寻找了一些其他类似的问题,但它并没有真正帮助,因为它是关于 ChoiceFieldchoices 而不是 ModelChoiceFieldqueryset

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}))

看起来就是这样,TextInputNumberInput 具有默认值,但 initial 不适用于 ModelChoiceField

例如,在教师姓名的 ModelChoiceField 中,您从视图中发送了一个姓名,这是错误的,因为您必须将教师的 ID 发送到表单,并且该 ID 在初始时分配给它。其余的也应该这样做。

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)