2011-01-14 147 views
18

我想摆脱Django在ModelForm上代表外键的选择输入中添加的“-------------”选项ModelChoiceField,删除空白选项

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

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

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

修改ModelChoiceField的查询集但这将是非常难看,因为这发生在“主”了+10 foreign_keys模型,并有超过的ModelForm更多基于此模型

整个背景:

  • 这些foreign_key点之一相同的一种模型:它们是特定的选择列表,许多模型通过管理员来简化它们的修改。
  • 所有这些模型都通过一个“to_field = code”关系与主模型相关,基于一个包含三字母代码的Charfield(嘿,不是我的错,我不得不使用传统的MS Access DB),这CharField有blank=True, unique=True选项,这样我就可以,每个列表,创建一个"---No information yet---"纪录而言,你打赌,一个空值,而不是三个字母代码...

目前情况:我得到一个有两个“空白值”选择的选择输入字段:django和我的一个接一个。 我只是错过了“empty_label = none`选择在这里太...

+0

我想你可以重新定义/覆盖的领域。我这样做将DateTime模型字段更改为表单TimeField(并添加DateField的额外字段)。然后我重写表单的clean()方法来组合日期和时间字段。 – 2011-01-15 08:07:20

回答

27

如果要删除空白的选择。所有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 S,所以也可以是更细粒度的,如:

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

肯定比__init__容易覆盖您提到!

从莫里茨

您可以使用2017+使用

更新:

forms.ModelChoiceField(... empty_label=None 

+0

这是很好的Yuji,希望我可以在UP箭头上点击十次。 ModelForms并非如此封闭我认为毕竟 – 2011-01-14 20:38:56