95

我有这样的表格:

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

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

4

7 回答 7

125
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
于 2015-05-22T18:54:43.580 回答
114

猜猜你的模型是这样的:

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')
于 2013-04-25T05:27:10.023 回答
24
field = models.CharField(max_length=9, default='', blank=True)

只需添加blank=True您的模型字段,当您使用modelforms.

“如果模型字段有blank=True,则在表单字段上将 required 设置为 False。否则,required=True。”

来源: https ://docs.djangoproject.com/en/3.1/topics/forms/modelforms/#field-types

于 2019-03-26T12:00:14.140 回答
7

您必须添加:

address = forms.CharField(required=False)
于 2014-08-07T16:42:26.830 回答
6

解决方案:同时使用blank=True, null=True

my_field = models.PositiveIntegerField(blank=True, null=True)

解释:

如果你使用null=True

my_field = models.PositiveIntegerField(null=True)

thenmy_field是必需的,*在表单中旁边是它,您不能提交空值。

如果你使用blank=True

my_field = models.PositiveIntegerField(blank=True)

thenmy_field不是必需的,*表单中不会有旁边的,您不能提交该值。但它会得到不允许的空字段。

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

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

于 2020-06-27T09:53:45.717 回答
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)

我也认为这是最漂亮的解决方案,因为你做同样的事情,放nullblankTrue,天气你有一个简单的char领域,或者像我一样,ManyToMany领域。

于 2017-07-10T10:12:47.520 回答
0

以上答案都是正确的;不过请注意,null=TrueManyToManyField 上的设置在数据库级别没有影响,并且在迁移时会引发以下警告:

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

在这个其他线程中解释了一个很好的答案。

于 2019-09-05T10:15:08.647 回答