我正在使用Django 1.0.2.我写了一个由Model支持的ModelForm.此模型有一个ForeignKey,其中blank = False.当Django为此表单生成HTML时,它会创建一个选择框,其中包含ForeignKey引用的表中每一行的一个选项.它还在列表顶部创建一个没有值的选项,并显示为一系列破折号:
我想知道的是:
从选择框中删除此自动生成选项的最简洁方法是什么?
定制它的最简洁方法是什么,以便它显示为:
在寻找解决方案时,我遇到了Django票4653,这给我的印象是其他人有同样的问题,并且Django的默认行为可能已被修改.这张票超过一年,所以我希望可能有更清洁的方法来完成这些事情.
谢谢你的帮助,
杰夫
编辑:我已经配置了ForeignKey字段:
verb = models.ForeignKey(Verb, blank=False, default=get_default_verb)
这确实设置了默认值,因此它不再是空/短划线选项,但不幸的是它似乎无法解决我的任何问题.也就是说,空/破折号选项仍然出现在列表中.
没有测试,但基于阅读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属性后重新将选项分配给小部件.由于这有点hacky,可能更容易理解的另一个选项是覆盖整个ModelChoiceField:
class ThingForm(models.ModelForm): verb = ModelChoiceField(Verb.objects.all(), empty_label=None) class Meta: model = Thing
来自文档
如果模型字段为空白= False且显式默认值(最初将选择默认值),则不会包括空白选项.
所以设置默认值就可以了
以Carl的回答为指导,在Django源码周围生根几个小时后,我认为这是完整的解决方案:
要删除空选项(扩展Carl的示例):
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 # following line needed to refresh widget copy of choice list self.fields['verb'].widget.choices = self.fields['verb'].choices
要自定义空选项标签基本相同:
class ThingForm(models.ModelForm): class Meta: model = Thing def __init__(self, *args, **kwargs): super(ThingForm, self).__init__(*args, **kwargs) self.fields['verb'].empty_label = "Select a Verb" # following line needed to refresh widget copy of choice list self.fields['verb'].widget.choices = self.fields['verb'].choices
我认为这种方法适用于将ModelChoiceFields呈现为HTML的所有场景,但我并不积极.我发现当初始化这些字段时,它们的选择将传递给Select小部件(请参阅django.forms.fields.ChoiceField._set_choices).初始化后设置empty_label不会刷新Select小部件的选项列表.我对Django不太熟悉,知道这是否应该被视为一个bug.
您可以在模型上使用它:
class MyModel(models.Model): name = CharField('fieldname', max_length=10, default=None)
默认=无答案:D
注意:我在Django 1.7上试过这个
至于django 1.4你需要的是在选择字段上设置"默认"值和"空白=假"
class MyModel(models.Model): CHOICES = ( (0, 'A'), (1, 'B'), ) choice_field = models.IntegerField(choices=CHOICES, blank=False, default=0)
请参阅此处,了解有关此问题的完整辩论和解决方法.
你可以在管理员中这样做:
formfield_overrides = { models.ForeignKey: {'empty_label': None}, }