Django 模型不是必填字段

问题描述 投票:0回答:7

我有这样的表格:

class My_Form(ModelForm):
    class Meta:
        model = My_Class
        fields = ('first_name', 'last_name' , 'address')

如何将地址字段设置为可选?

django django-forms option-type django-models
7个回答
147
投票
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

122
投票

猜猜你的模型是这样的:

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


30
投票
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 模型管理


9
投票

您必须添加:

address = forms.CharField(required=False)

6
投票

解决方案:同时使用

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
就不是必填项,表单中不会有
*
旁边,无法提交该值。但它会得到不允许的空字段。

注意:标记为不需要和允许空字段是两件不同的事情。

专业提示:阅读错误比阅读文档更仔细。


5
投票

@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
字段.


0
投票

以上答案正确;不过,请注意,在 ManyToManyField 上设置

null=True
在数据库级别没有影响,并且在迁移时会引发以下警告:

(fields.W340) null has no effect on ManyToManyField.

另一个线程中解释了一个很好的答案。

© www.soinside.com 2019 - 2024. All rights reserved.