Django模型表单中的必填字段

79 投票
6 回答
88419 浏览
提问于 2025-04-15 12:56

我有一个表单,其中有几个字段被标记为必填,但我其实不想要这样。下面是我在models.py中的表单代码:

class CircuitForm(ModelForm):
    class Meta:
        model = Circuit
        exclude = ('lastPaged',)
    def __init__(self, *args, **kwargs):
        super(CircuitForm, self).__init__(*args, **kwargs)
        self.fields['begin'].widget = widgets.AdminSplitDateTime()
        self.fields['end'].widget = widgets.AdminSplitDateTime()

在实际的Circuit模型中,这些字段是这样定义的:

begin = models.DateTimeField('Start Time', null=True, blank=True)
end = models.DateTimeField('Stop Time', null=True, blank=True)

这是我在views.py中的相关代码:

def addCircuitForm(request):
    if request.method == 'POST':
        form = CircuitForm(request.POST)
        if form.is_valid():
            form.save()
            return HttpResponseRedirect('/sla/all')
    form = CircuitForm()    
    return render_to_response('sla/add.html', {'form': form})

我该怎么做才能让这两个字段不是必填的呢?

6 个回答

11

在DataGreed的回答基础上,我创建了一个Mixin,这个Mixin让你可以在Meta类中指定一个fields_required变量,像这样:

class MyForm(RequiredFieldsMixin, ModelForm):

    class Meta:
        model = MyModel
        fields = ['field1', 'field2']
        fields_required = ['field1']

下面是具体的代码:

class RequiredFieldsMixin():

    def __init__(self, *args, **kwargs):

        super().__init__(*args, **kwargs)

        fields_required = getattr(self.Meta, 'fields_required', None)

        if fields_required:
            for key in self.fields:
                if key not in fields_required:
                    self.fields[key].required = False
19

如果模型字段设置了blank=True,那么表单字段的required就会被设置为False。否则,required就会是True。

这里有说明: http://docs.djangoproject.com/en/dev/topics/forms/modelforms/

看起来你做的都没错。你可以检查一下 self.fields['end'].required 的值。

118

如果你不想修改模型里字段的空白设置(这样做会影响到管理员网站的正常验证),你可以在你的表单类里这样做:

def __init__(self, *args, **kwargs):
    super(CircuitForm, self).__init__(*args, **kwargs)

    for key in self.fields:
        self.fields[key].required = False 

重新定义的构造函数不会影响任何功能。

撰写回答