我有一个表格,当我不想要它们时,根据需要出现几个字段。这是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()
在实际的电路模型中,字段的定义如下:
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})
我可以做什么才能不需要这两个字段?
答案 0 :(得分:111)
如果您不想修改模型中字段的空白设置(这样做会破坏管理网站中的正常验证),您可以在Form类中执行以下操作:
def __init__(self, *args, **kwargs):
super(CircuitForm, self).__init__(*args, **kwargs)
for key in self.fields:
self.fields[key].required = False
重新定义的构造函数不会损害任何功能。
答案 1 :(得分:17)
如果模型字段为空= True,则表单字段上的required设置为False。否则,required = True
这里说的是:http://docs.djangoproject.com/en/dev/topics/forms/modelforms/
看起来你正在做的一切正确。
您可以查看self.fields['end'].required
。
答案 2 :(得分:4)
扩展DataGreed的答案,我创建了一个Mixin,允许您在fields_required
类上指定Meta
变量,如下所示:
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
答案 3 :(得分:3)
这不是一个答案,但对于通过Google发现这一点的其他任何人来说,还有一点数据:这是在带有DateField的模型表单上发生的。它需要设置为False,模型有“null = True,blank = True”,如果我在clean()方法中查看它,表单中的字段显示required = False,但它仍然说我需要一个有效的日期格式。我没有使用任何特殊小部件,即使我明确设置input_formats = ['%Y-%m-%d','%m /%d /%Y','我也得到“输入有效日期”消息表格字段上的%m /%d /%y','']。
编辑:不知道是否会帮助其他人,但我解决了我遇到的问题。我们的表单在字段中有一些默认文本(在这种情况下,单词“to”表示该字段是结束日期;该字段称为“end_time”)。我特意在表单的clean()方法中寻找单词“to”(我也尝试过clean_end_time()方法,但它从未调用过)并将clean_data变量的值设置为None,如{{ 3}}。然而,这一切都不重要(我猜)模型的验证已经在“to”的无效日期格式上进行了解释而没有让我有机会拦截它。
答案 4 :(得分:0)
答案 5 :(得分:0)
如果您有如下所示的型号,
class Article(models.Model):
headline = models.CharField(
max_length=200,
null=True,
blank=True,
help_text='Use puns liberally',
)
content = models.TextField()
您可以将标题的表单验证更改为required=True
而不是blank=False
,将其更改为模型的定义,如下所示。
class ArticleForm(ModelForm):
headline = MyFormField(
max_length=200,
required=False,
help_text='Use puns liberally',
)
class Meta:
model = Article
fields = ['headline', 'content']
回答这个问题,
class CircuitForm(ModelForm):
begin = forms.DateTimeField(required=False)
end = forms.DateTimeField(required=False)
class Meta:
model = Circuit
exclude = ('lastPaged',)
这使begin
和end
成为required=False