Python 模型表单中的Django必填字段
我有一个表单,当我不需要它们的时候,一些字段会根据需要显示出来。这是models.py的表单Python 模型表单中的Django必填字段,python,django,forms,model,widget,Python,Django,Forms,Model,Widget,我有一个表单,当我不需要它们的时候,一些字段会根据需要显示出来。这是models.py的表单 class CircuitForm(ModelForm): class Meta: model = Circuit exclude = ('lastPaged',) def __init__(self, *args, **kwargs): super(CircuitForm, self).__init__(*args, **kwargs)
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)
class MyForm(RequiredFieldsMixin, ModelForm):
class Meta:
model = MyModel
fields = ['field1', 'field2']
fields_required = ['field1']
此处是我的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})
我该怎么做才能不需要这两个字段
如果模型字段为blank=True,则表单字段上的required设置为False。否则,required=True
这里这么说:
看起来你做的一切都对。
您可以检查
self.fields['end']的值。必填项
如果您不想修改模型中字段的空白设置(这样做会破坏管理站点中的正常验证),您可以在表单类中执行以下操作:
def __init__(self, *args, **kwargs):
super(CircuitForm, self).__init__(*args, **kwargs)
for key in self.fields:
self.fields[key].required = False
重新定义的构造函数不会损害任何功能。这不是一个答案,但对于通过谷歌找到它的任何人来说,还有一点数据:这发生在我身上的是一个带有日期字段的模型表单。它将required设置为False,模型有“null=True,blank=True”,如果我在clean()方法中查看,表单中的字段显示required=False,但它仍然说我需要一个有效的日期格式。我没有使用任何特殊的小部件,即使在表单字段上显式设置输入格式=['%Y-%m-%d','%m/%d/%Y','%m/%d/%Y','',我也会收到“输入有效日期”消息
编辑:不知道它是否能帮助其他人,但我解决了我遇到的问题。我们的表单在字段中有一些默认文本(在本例中,单词“to”表示该字段是结束日期;该字段称为“end_time”)。我专门在表单的clean()方法中查找单词“to”(我也尝试了clean_end_time()方法,但从未调用过),并按照中的建议将clean_数据变量的值设置为None。然而,这些都不重要,因为(我猜)模型的验证已经在无效的日期格式“to”上吐了,而没有给我机会拦截它 这是使用小部件时出现的错误: 解决方法:
或者票证12303展开DataGreed的回答,我创建了一个Mixin,允许您在
元
类上指定所需的字段
变量,如下所示:
begin = models.DateTimeField('Start Time', null=True, blank=True)
end = models.DateTimeField('Stop Time', null=True, blank=True)
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
从
如果您有如下所示的模型
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
这些字段不可能通过更改小部件变成必需的。如果模型具有(null=True,blank=True),则模型表单将按required=False呈现它。看起来您是对的。字段本身不是必需的,但小部件中的日期和时间字段是必需的。如果此mixin的用户也将覆盖\uuuuu init\uuuu
,会发生什么?混音器还能用吗?多重继承将如何解决?@user3599803当您重写\uuuu init\uuuu
时,您应该始终调用super()
,就像在我的代码片段中所做的那样。因此,如果我理解-我创建了一个表单和子类MyForm。我从init()调用super,它将调用mixin init,但是当调用djangl form init时?是的,还有其他资源在讨论这个问题,如果您愿意,您也可以创建一个新问题,请在这里保留关于这个特定问题主题的注释。请注意一些字段(例如BooleanField
)将blank=True硬编码到其构造函数()中。因此,设置blank=False将自动失败。您必须在表单的构造函数中使用self.fields[…].required=True
,以强制这些字段执行必需的行为。另见。