Django模型表单中的必填字段
我有一个表单,其中有几个字段被标记为必填,但我其实不想要这样。下面是我在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
重新定义的构造函数不会影响任何功能。