一尘不染

自定义/删除Django选择框空白选项

django

我正在使用Django 1.0.2。我已经写了一个由模型支持的ModelForm。此模型具有一个ForeignKey,其中blank = False。当Django为该表单生成HTML时,它会创建一个选择框,其中对ForeignKey引用的表中的每一行都有一个选项。它还在列表顶部创建一个没有值的选项,并显示为一系列破折号:

<option value="">---------</option>

我想知道的是:

  1. 从选择框中删除此自动生成的选项的最干净的方法是什么?
  2. 什么是最干净的自定义方式,使其显示为:
<option value="">Select Item</option>

在寻找解决方案时,我遇到了Django票证4653,给我的印象是其他人也有同样的问题,并且Django的默认行为可能已被修改。这张票已经使用了一年多,所以我希望可以有一种更清洁的方式来完成这些事情。

谢谢你的帮助,

杰夫

编辑:我已经配置了ForeignKey字段为:

verb = models.ForeignKey(Verb, blank=False, default=get_default_verb)

这确实设置了默认值,因此不再是空/破折号选项,但是不幸的是它似乎无法解决我的任何一个问题。即,空/破折号选项仍出现在列表中。


阅读 488

收藏
2020-03-28

共1个答案

一尘不染

还没有测试过,但是基于在这里和这里阅读Django的代码,我相信它应该可以工作:

class ThingForm(models.ModelForm):
  class Meta:
    model = Thing

  def __init__(self, *args, **kwargs):
    super(ThingForm, self).__init__(*args, **kwargs)
    self.fields['verb'].empty_label = None

编辑:这已记录在案,尽管如果你正在使用自动生成的ModelForm,则不一定知道要查找ModelChoiceField。

编辑:正如jlpp在他的回答中指出的那样,这还不完整-更改empty_label属性后,你必须将选项重新分配给小部件。由于有点黑,所以可能更容易理解的另一个选项是覆盖整个ModelChoiceField:

class ThingForm(models.ModelForm):
  verb = ModelChoiceField(Verb.objects.all(), empty_label=None)

  class Meta:
    model = Thing
2020-03-28