在 Django 中,为啥模型中的 blank=True 不会使表单字段不是强制性的?
Posted
技术标签:
【中文标题】在 Django 中,为啥模型中的 blank=True 不会使表单字段不是强制性的?【英文标题】:In Django, why blank=True in the model is not making the form field not mandatory?在 Django 中,为什么模型中的 blank=True 不会使表单字段不是强制性的? 【发布时间】:2020-05-29 10:48:20 【问题描述】:在 django 文档中有信息表明,通过将 CharField 类型的模型字段声明为空白 = True,表单将不需要填写相应的字段。但是,在我的项目中,这不是在职的。为了使表单中的字段不是强制性的,我发现的唯一替代方法是将其定义为 required=False。 我正在使用 Django 3.0.2。
如果表单没有在模型中定义空白=True 的字段,则没有错误。但是如果表单有这个字段,它只有在我添加 required=False 到表单字段时才有效,否则即使它在模型中定义为空白=True,它也是强制性的。
在 Django 2.2 中的行为相同。
Django 1.11.17 中的相同行为
【问题讨论】:
我想你读完这个answer就会得到你的答案。 对模型类的name字段使用blank=True和default='',在python控制台中,可以实例化一个对象(不为name字段提供值)并保存它使用 save() 方法在数据库中,但如果我尝试使用没有 required=False 的表单字段做同样的事情,django 需要填写名称字段。 【参考方案1】:我的问题的答案如下:
假设您定义了以下类:
class Client (models.Model):
name = models.CharField (max_length=100, blank=True)
address = models.CharField (max_length=100, blank=False)
如果表单类是这样定义的:
class ClientForm (ModelForm):
class Meta:
model = Client
fields = ['name', 'address']
widgets =
'name': forms.TextInput (attrs = 'class': 'form-control form-control-sm'),
'address': forms.TextInput (attrs = 'class': 'form-control form-control-sm')
然后,'name' 字段将不是强制性的(由于模型中的空白=True),而 'address' 字段将是强制性的(由于模型中的空白=False)。
但是,如果 ClientForm 类是这样定义的:
class ClientForm (ModelForm):
class Meta:
model = Client
fields = ['name', 'address']
name = forms.CharField (
widget = forms.TextInput (attrs = 'class': 'form-control form-control-sm'),
)
address = forms.CharField (
widget = forms.TextInput (attrs = 'class': 'form-control form-control-sm'),
)
然后,两个字段('name' 和 'address')都将是强制性的,“因为以声明方式定义的字段保持原样”(https://docs.djangoproject.com/en/3.0/topics/forms/modelforms/),即 ' 的默认值表单字段的 required' 属性为 True,这将要求填写字段 'name' 和 'address',即使在模型中,该字段已设置为 blank=True。
【讨论】:
以上是关于在 Django 中,为啥模型中的 blank=True 不会使表单字段不是强制性的?的主要内容,如果未能解决你的问题,请参考以下文章