在 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 不会使表单字段不是强制性的?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 django 模型的空白和空值不同的选项?

为啥 django 模型的空白和空值不同的选项?

Django 模型和 ModelForms 中的空白、Null 和必需

为啥 Django 模型信号不起作用?

为啥 DateField 数据类型在模型方法和视图中不同?

为啥 Django 在更改列表视图页面中进行不必要的 SQL 查询?