我有这样的表格:
class My_Form(ModelForm):
class Meta:
model = My_Class
fields = ('first_name', 'last_name' , 'address')
如何将地址字段设置为可选?
class My_Form(forms.ModelForm):
class Meta:
model = My_Class
fields = ('first_name', 'last_name' , 'address')
def __init__(self, *args, **kwargs):
super(My_Form, self).__init__(*args, **kwargs)
self.fields['address'].required = False
猜猜你的模型是这样的:
class My_Class(models.Model):
address = models.CharField()
您的 Django 版本表单 < 1.8:
class My_Form(ModelForm):
address = forms.CharField(required=False)
class Meta:
model = My_Class
fields = ('first_name', 'last_name' , 'address')
您的 Django 版本 > 1.8 的表单:
class My_Form(ModelForm):
address = forms.CharField(blank=True)
class Meta:
model = My_Class
fields = ('first_name', 'last_name' , 'address')
无耻插件:检查您的 Python 知识http://python.softwarequizzes.com
field = models.CharField(max_length=9, default='', blank=True)
只需在您的模型字段中添加
blank=True
,当您使用 modelforms
时就不需要它了。
“如果模型字段具有
blank=True
,则表单字段上的 required 将设置为 False。否则,required=True
。”
向模型添加
blank=True
也会影响Django管理,如果你的模型有null=True
并且你尝试插入一条记录,管理表单将显示错误,使用blank=True
,该字段变为可选。
来源: https://docs.djangoproject.com/en/5.0/topics/forms/modelforms/#field-types
[编辑][1]:将 Django 文档链接从 4.1 更改为 5.0
[编辑][2]:将有关此更改的相关信息添加到 Django 模型管理
您必须添加:
address = forms.CharField(required=False)
解决方案:同时使用
blank=True
、null=True
。
my_field = models.PositiveIntegerField(blank=True, null=True)
说明:
如果您使用
null=True
my_field = models.PositiveIntegerField(null=True)
那么
my_field
为必填项,表单中旁边有*
,不能提交空值。
如果您使用
blank=True
my_field = models.PositiveIntegerField(blank=True)
那么
my_field
就不是必填项,表单中不会有 *
旁边,无法提交该值。但它会得到不允许的空字段。
注意:标记为不需要和允许空字段是两件不同的事情。
专业提示:阅读错误比阅读文档更仔细。
@Anentropic 的解决方案 来自对 @Atma 的答案 的评论对我有用。我认为这也是最好的一个。
他的评论:
将导致null=True, blank=True
字段变为ModelForm
required=False
我刚刚将其设置在我的
UserProfile
类中的 ManyToMany 字段上,并且它运行完美。
我的
UserProfile
类现在看起来像这样(注意 friends
字段):
class UserProfile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
friends = models.ManyToManyField('self', null=True, blank=True)
我也认为这是最漂亮的解决方案,因为你做了同样的事情,将
null
和 blank
到 True
,如果你有一个简单的 char
字段,或者像我一样, ManyToMany
字段.
以上答案正确;不过,请注意,在 ManyToManyField 上设置
null=True
在数据库级别没有影响,并且在迁移时会引发以下警告:
(fields.W340) null has no effect on ManyToManyField.
另一个线程中解释了一个很好的答案。