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

Bas*_*ian 29 forms django

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

class Book(models.Model):
    library = models.ForeignKey(Library, null=False, blank=False)
    ...
Run Code Online (Sandbox Code Playgroud)

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

class BookSubmitForm(ModelForm):
    class Meta:
        model = Book
Run Code Online (Sandbox Code Playgroud)

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

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

Ily*_*lya 38

请参见ModelChoiceField.您必须将empty_label设置为None.所以你的代码将是这样的:

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

    class Meta:
        model = Book    
Run Code Online (Sandbox Code Playgroud)

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

  • 伟大的!如果您不打算更改查询集,您也可以简单地使用 `self.fields['library'].empty_label = None`。 (2认同)

Hen*_*Liu 11

如果您使用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 
Run Code Online (Sandbox Code Playgroud)

  • 不知何故,这对我不起作用。如果如上所述设置 empty_label = None,我仍然将“---------”视为选项之一。这对 Django 1.10 仍然有效吗? (2认同)

Mit*_*ril 11

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:]
Run Code Online (Sandbox Code Playgroud)


Dan*_*ski 7

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

class Book(models.Model):
    library = models.ForeignKey(Library, null=False, blank=False, default='')
    ...
Run Code Online (Sandbox Code Playgroud)

  • 仅仅为了适应表格而改变模型似乎是不对的。仅当您的模型以这种方式行事有意义时才应这样做。 (2认同)