ModelChoiceField,删除空白选项

时间:2011-01-14 15:29:30

标签: django django-forms

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

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

我知道我可以覆盖ModelForm的__init__()方法,以便使用

修改ModelChoiceField的查询集
self.fields['my_foreign_key'].queryset = ....

但这真的很难看,因为这发生在“Main”模型上的+10个foreign_keys上,而且不仅仅是基于这个模型的Modelform

整个背景:

  • 这些foreign_key中的每一个都指向相同类型的模型:它们是特定的选择列表,许多模型可以通过管理员轻松修改。
  • 所有这些模型都通过“to_field = code”关系与Main模型相关,基于包含三字母代码的Charfield(嘿,不是我的错,我必须使用传统的MS Access DB),这个CharField有blank=True, unique=True个选项,所以我可以为每个列表创建一个"---No information yet---"记录,你打赌它有一个空白值而不是三个字母的代码......

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

1 个答案:

答案 0 :(得分:29)

如果您要删除所有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__覆盖更容易!

从Moritz更新

您可以使用2017+使用:

forms.ModelChoiceField(... empty_label=None