Django modelform不需要字段


Answers:


94

猜你的模型是这样的:

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')

3
外键字段呢?
digz6666

16
使用ModelChoiceField。所以,如果字段定义是abc=models.ForeignKey(Abc),你可以写abc = forms.ModelChoiceField(queryset=Abc.objects.all(), required=False)
AKSHAR Raaj

2
如果您以前不使用过表单,请确保将其导入:from django import forms
Justin McCandless,

106
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

3
尽管akshar的答案看起来更好,但是此方法可防止您必须做一些事情来设置诸如help_text和label之类的东西。
Blackeagle52

3
此方法在处理模型级别定义为FK的字段时特别有用。通过akshar的方法,必须设置queryset属性。
PritishC '16


7

您必须添加:

address = forms.CharField(required=False)

4
blank和null属性未用于ModelForms
Fernando Ferreira

3
这应该在模型字段中,而不是在表单字段中。null=True, blank=True将导致ModelForm字段为required=False
Anentropic

3

@Anentropic对@Atma答案的评论中的解决方案对我有用。我认为这也是最好的。

他的评论:

null = True,空白= True将导致需要ModelForm字段= 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领域。

再次感谢@Anentropic。:)

PS我之所以写这篇文章是因为我无法发表评论(我的声誉不到50),还因为我认为他的评论需要更多的曝光度。

PPS如果此回答对您有所帮助,请敬请发表评论。

干杯:)


2

解决方案:同时使用blank=Truenull=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,在表单中不使用*,您就不能提交值。但是会得到不允许的空字段。

注意:

1) marking as not required and 
2) allowing null field are two different things.

专家提示:

Read the error more carefully than documentation.

0

以上答案是正确的;但是,请注意,null=TrueManyToManyField上的设置在数据库级别上无效,并且在迁移时会引发以下警告:

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

在另一个线程中对此有一个很好的答案。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.