如何在Django ModelForm中删除“None”选项?

时间:2011-09-14 17:10:33

标签: django django-models django-forms

例如,我有一个这样的模型:

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的字段方法

5 个答案:

答案 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.pyadmin.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个选项:

  1. 没有
  2. 选项1
  3. 选项2

如果将blank参数设置为False,将只有两个选项:

  1. 选项1
  2. 选项2

答案 4 :(得分:-1)

我认为这是how-to-get-rid-of-the-bogus-choice-generated-by-radioselect-of-django-form

的副本

答案就在那里,而其他链接,希望会有所帮助。

修改

所以也许如果你试试这个,(我没有这样做,没有保修:))

widget = {
            'type': forms.RadioSelect(choices=Item.TYPE_CHOICES),
        }