Django需要模型forms的字段

当我不需要他们的时候,我有一个表格可以根据需要出现几个字段。 这是来自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}) 

我可以做什么,这两个领域是不需要的?

如果您不想修改模型中字段的空白设置(这样做会破坏pipe理站点中的正常validation),则可以在Form类中执行以下操作:

 def __init__(self, *args, **kwargs): super(CircuitForm, self).__init__(*args, **kwargs) for key in self.fields: self.fields[key].required = False 

重新定义的构造函数不会损害任何function。

如果模型字段具有空白= True,则在表单字段中将required设置为False。 否则,required = True

这样说: http : //docs.djangoproject.com/en/dev/topics/forms/modelforms/

看起来你正在做的一切正确。 您可以检查self.fields['end'].required的值。

这不是一个答案,但是对于通过Google发现这个问题的任何人来说,还有一点数据:这发生在一个带有DateField的模型表单上。 它需要设置为False,模型具有“null = True,blank = True”,如果在clean()方法中查看它,则表单中的字段显示required = False,但仍然表示我需要一个有效的date格式。 即使当我明确地设置了input_formats = ['%Y-%m-%d','%m /%d /%Y','我没有使用任何特殊的小部件,我得到了“input有效的date” %m /%d /%y','']。

编辑:不知道是否会帮助其他人,但我解决了我遇到的问题。 我们的表单在字段中有一些默认文本(在这种情况下,单词“to”表示该字段是结束date;该字段称为“end_time”)。 我特别在表单的clean()方法中寻找单词“to”(我也尝试了clean_end_time()方法,但它从来没有被调用过),并将clean_datavariables的值设置为None,如本Django票 。 然而,没有一个重要的(我猜)模型的validation已经在无效的date格式“to”没有给我一个机会截取它。

扩展DataGreed的答案,我创build了一个Mixin,允许您在Meta类中指定fields_requiredvariables,如下所示:

 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 

这是使用小部件时的错误:

解决方法: 在自定义表单中使用Django时间/date小部件

或票12303

从模型现场文件 ,

如果您有如下所示的模型,

 class Article(models.Model): headline = models.CharField( max_length=200, null=True, blank=True, help_text='Use puns liberally', ) content = models.TextField() 

您可以将标题的表单validation更改为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',) 

这使得beginendrequired=False