Django,如何从modelform中的选择字段中删除空白选项?

时间:2012-01-10 05:02:33

标签: django forms

我创建了一个带有外键的模型:

class Book(models.Model):
    library = models.ForeignKey(Library, null=False, blank=False)
    ...

然后我创建了一个带有ModelForm的表单,以显示给用户:

class BookSubmitForm(ModelForm):
    class Meta:
        model = Book

当我显示带有表单的页面时,我会获得库选项,但也会默认显示空白(--------)选项。

我认为在模型中使用null = False和blank = False可以摆脱ModelForm中的空白选择但是没有。我该怎么做只在列表中有实际选择而不是那个?

5 个答案:

答案 0 :(得分:35)

ModelChoiceField。您必须将empty_label设置为None。所以你的代码将是:

class BookSubmitForm(ModelForm):
    library = ModelChoiceField(queryset=Library.objects, empty_label=None)

    class Meta:
        model = Book    

编辑:将字段名称更改为小写

答案 1 :(得分:10)

如果您使用ModelForm,那么您不必指定queryset,required,label等。但是对于upvoted答案,您必须再次执行此操作。

实际上你可以这样做以避免重新指定所有内容

class BookSubmitForm(ModelForm):
    def __init__(self, *args, **kwargs):
        super(BookSubmitForm, self).__init__(*args, **kwargs)
        self.fields['library'].empty_label = None

    class Meta:
        model = Book 

答案 2 :(得分:10)

self.fields['xxx'].empty_label = None无法使用如果您的字段类型为TypedChoiceField且没有empty_label属性。 我们应该做的是删除第一选择:

class BookSubmitForm(forms.ModelForm):

    def __init__(self, *args, **kwargs):
        super(BookSubmitForm, self).__init__(*args, **kwargs)

        for field_name in self.fields:
            field = self.fields.get(field_name)
            if field and isinstance(field , forms.TypedChoiceField):
                field.choices = field.choices[1:]

答案 3 :(得分:7)

如果在模型字段定义中指定blank=Falsedefault=<VALUE>,则默认情况下Django不会呈现空白选项;请注意,默认值可以是无效选项,例如设置为''或任何invalid choice

class Book(models.Model):
    library = models.ForeignKey(Library, null=False, blank=False, default='')
    ...

答案 4 :(得分:0)

只需转到您的选择列表(假设您已将其设为CharField)并为None提供以下代码:

此外,请记住,这是一个示例,与所涉及的代码无关。它只是为了帮助任何使用默认选项的人。

GENDER_CHOICES = (
    (None, 'Sex:'),
    ('M', 'Male'),
    ('F', 'Female'),
    ('G', 'Gay'),
    ('L', 'Lesbian'),
    ('B', 'Bi'),
    ('O', 'Other')
)
Choose_gender = models.CharField(max_length=1, choices=GENDER_CHOICES, blank=True)

通过指定None,您告诉选择字段默认为特定字符串。如果您不希望默认设置为无,则只需将''放在空括号中即可。