例如,我有一个这样的模型:
class Item(models.Model):
TYPE_CHOICES = (
(1, _('type 1')),
(2, _('type 2')),
)
type = models.PositiveSmallIntegerField(max_length=1, choices=TYPE_CHOICES)
对于我的表格:
class ItemModelForm(forms.ModelForm):
class Meta:
model = Item
widget = {
'type': forms.RadioSelect(),
}
我想要的是具有2个选项的无线电选择(“类型1”和“类型2”)。但是,我将有3个选项,“---------”,“类型1”和“类型2”。我认为“---------”代表“无”,但模型中需要“类型”字段,为什么“无”选项仍然显示?
但如果我改用Form:
class ItemForm(forms.Form):
type = forms.ChoiceField(widget=forms.RadioSelect(), choices=Item.TYPE_CHOICES)
我只有两个选项,“类型1”和“类型2”,这是正确的。
我想在标准表格上使用ModelForm,但不知道如何删除“---------”。有人能帮助我吗?感谢。
更新: 谢谢大家,刚刚发现它已被回复here。
看起来我必须覆盖ModelForm的字段或方法。
答案 0 :(得分:5)
您应该可以将empty_label
设置为None
。
type = forms.ChoiceField(widget=forms.RadioSelect(), choices=Item.TYPE_CHOICES, empty_label=None)
答案 1 :(得分:1)
如果你有一个modelForm,你应该用forms.ModelChoiceField()
而不是models.ChoiceField()
覆盖表单中的字段,然后添加如上所示的参数,用queryset替换选项。
type = forms.ModelChoiceField(widget=forms.RadioSelect(), empty_label=None, queryset=TYPE.objects.all())
答案 2 :(得分:0)
有一种更简单的方法,没有覆盖任何东西:只需像这样添加default=1
:
type = models.PositiveSmallIntegerField(max_length=1, choices=TYPE_CHOICES, default=1)
在Django源代码中找到了这个:
include_blank = (self.blank or
not (self.has_default() or 'initial' in kwargs))
答案 3 :(得分:0)
对于那些从Google到达这里寻求现代版本Django的合适答案并且具有models.py
和admin.py
设置类似于以下内容的人。
# models.py
class SampleModel(models.Model):
SAMPLE_OPTIONS = (
('Option 1', 'Option 1'),
('Option 2', 'Option 2'),
)
...
sample_options = models.CharField(
_('Sample Options'),
choices=SAMPLE_OPTIONS,
default='Option 1',
blank=False,
max_length=17,
)
...
# admin.py
class SampleAdmin(admin.ModelAdmin):
...
radio_fields = {'sample_options': admin.HORIZONTAL}
...
如果将blank
参数设置为True
,将有3个选项:
如果将blank
参数设置为False
,将只有两个选项:
答案 4 :(得分:-1)
我认为这是how-to-get-rid-of-the-bogus-choice-generated-by-radioselect-of-django-form
的副本答案就在那里,而其他链接,希望会有所帮助。
修改强>
所以也许如果你试试这个,(我没有这样做,没有保修:))
widget = {
'type': forms.RadioSelect(choices=Item.TYPE_CHOICES),
}