【问题标题】:How to remove "None" option in Django ModelForm?如何删除 Django ModelForm 中的“无”选项?
【发布时间】:2011-09-14 17:10:33
【问题描述】:

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

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 个选项(“type 1”和“type 2”)的单选。但是,我将有 3 个选项,“------”、“类型 1”和“类型 2”。 “---------”我认为是“无”,但模型中需要“类型”字段,为什么“无”选项仍然出现?

但如果我改用表单:

class ItemForm(forms.Form):
    type = forms.ChoiceField(widget=forms.RadioSelect(), choices=Item.TYPE_CHOICES)

我将只有 2 个选项,“类型 1”和“类型 2”,这是正确的。

我想在标准表单上使用 ModelForm,但不知道如何删除“---------”。有人可以帮助我吗?谢谢。

更新: 谢谢各位,刚刚发现已经回复here了。

看来我必须覆盖 ModelForm 的 fieldmethod

【问题讨论】:

    标签: django django-models django-forms


    【解决方案1】:

    您应该可以为此设置 empty_labelNone

    type = forms.ChoiceField(widget=forms.RadioSelect(), choices=Item.TYPE_CHOICES, empty_label=None)
    

    【讨论】:

    • 感谢您的回复,但这是标准表格,对吗?如果我使用标准表格,我没有问题。但是如何在 ModelForm 中禁用该选项?我的意思是,如果我使用 ModelForm,我只想有 2 个选项,“type 1”和“type 2”,而不是“----------”、“type 1”和“type 2” .
    • 你至少可以试试我的解决方案。对我来说很好用:P
    • 它直接覆盖(重新定义)字段本身,这不是我想要的 ModelForm 解决方案。通过这样做,我什至不需要“empty_label”参数来删除空选项。问题是,如果稍后在 Model 中更改“类型”,我将需要手动更新 Form 中的字段,这对于使用 ModelForm 而不是常规 Form 没有意义。你是对的,它运作良好,但它不是 ModelForm 的最佳解决方案。非常感谢您的帮助!
    【解决方案2】:

    如果你有一个modelForm,你应该用forms.ModelChoiceField()而不是models.ChoiceField()覆盖表单中的字段,然后添加上面显示的参数,用queryset替换choices。

    type = forms.ModelChoiceField(widget=forms.RadioSelect(), empty_label=None, queryset=TYPE.objects.all())
    

    【讨论】:

      【解决方案3】:

      有一种更简单的方法,无需覆盖任何内容:只需像这样添加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))
      

      【讨论】:

        【解决方案4】:

        对于从 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. 选项 1
        2. 选项 2

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

        1. 选项 1
        2. 选项 2

        【讨论】:

          【解决方案5】:

          正如我所见,它是 how-to-get-rid-of-the-bogus-choice-generated-by-radioselect-of-django-form 的副本

          答案就在那里,还有其他链接,希望对您有所帮助。

          编辑

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

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

          【讨论】:

          • 这不适用于 ModelForm。我发现了一些东西here
          猜你喜欢
          • 1970-01-01
          • 2012-04-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-05-30
          • 2010-10-12
          • 1970-01-01
          • 2010-09-22
          相关资源
          最近更新 更多