首页 文章

ModelChoiceField,删除空白选项

提问于
浏览
18

我想摆脱Django在模拟窗体上表示外键的选择输入中添加“-------------”选项

您可以使用 empty_label=none 选项been answered,但我有一个ModelForm,而不是常规表单,并且不允许覆盖该字段 .

我知道我可以覆盖ModelForm的 __init__() 方法,以便使用ModelChoiceField的查询集进行修改

self.fields['my_foreign_key'].queryset = ....

但这真的很难看,因为这种情况发生在“主”模型的10多个外键上,并且不仅仅是基于这个模型的模型形式

整个背景:

  • 这些foreign_key中的每一个指向相同类型的模型:它们是特定的选择列表,许多模型通过管理员来简化它们的修改 .

  • 所有这些模型都通过"to_field=code"关系与主模型相关,基于包含三个字母代码的Charfield(嘿,不是我的错,我不得不使用传统的MS Access DB),这个CharField有 blank=True, unique=True 选项,所以我可以为每个列表创建一个 "---No information yet---" 记录,你打赌,它有一个空白值而不是三个字母的代码......

现在的情况是:我得到一个带有两个“空白值”选择的选择输入字段:django one和mine,一个接一个 . 我在这里也错过了'empty_label = none`选项...

1 回答

  • 28

    如果你想删除所有 ModelChoiceField 的空白选择,你可以做类似的事情..

    class Form(forms.ModelForm):
        class Meta:
            model = MyModel
    
        def __init__(self, *args, **kwargs):
            super(Form, self).__init__(*args, **kwargs)
            modelchoicefields = [field for field_name, field in self.fields.iteritems() if
                isinstance(field, forms.ModelChoiceField)]
    
            for field in modelchoicefield:
                field.empty_label = None
    

    但这将取代所有 ModelChoiceField ,所以也许更细粒度的东西:

    for fieldname in ('field1','field2','field3','field4','field5','field6'):
        self.fields[fieldname].empty_label = None
    

    肯定比你提到的 __init__ 覆盖更容易!

    莫里茨的更新

    您可以使用2017年使用:

    forms.ModelChoiceField(... empty_label=None
    

相关问题