当我们在Django中添加模型字段时,我们通常这样写:
models.CharField(max_length=100, null=True, blank=True)
ForeignKey, DecimalField等也是如此。两者的基本区别是什么:
null = True只
空白= True只
null=True, blank=True
对于不同的(CharField, ForeignKey, ManyToManyField, DateTimeField)字段?使用选项1、2或3的优点/缺点是什么?
这里,是null=True和blank=True的主要区别:
null和blank的默认值都是False。这两个值都在字段级工作,即,我们是否想要保持字段为空或空白。
null=True将字段的值设置为null,即没有数据。它基本上是为数据库列的值。
date = models.DateTimeField(null=True)
blank=True确定表单中是否需要该字段。这包括管理表单和您自己的自定义表单。
title = models.CharField(blank=True) // title可以为空。
在数据库中(“”)将被存储。
null=True blank=True这意味着该字段在所有情况下都是可选的。
epic = models.ForeignKey(null=True, blank=True)
// The exception is CharFields() and TextFields(), which in Django are never saved as NULL. Blank values a
在模型中null=True和blank=True的含义还取决于这些字段在表单类中的定义方式。
假设你已经定义了以下类:
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。