【问题标题】:Django - CheckboxSelectMultiple without "------" choiceDjango - CheckboxSelectMultiple 没有“-----”选择
【发布时间】:2012-03-19 00:46:38
【问题描述】:

如何从呈现的选项中删除“------”? 我以我的模型形式使用:

widgets = {
    'event_form': forms.CheckboxSelectMultiple(),
}

在模型中,我有 IntegerField 可供选择:

EVENT_FORM_CHOICES = (
    (1, _(u'aaaa')),
    (2, _(u'bbbb')),
    (3, _(cccc')),
    (4, _(u'dddd')),
    (5, _(eeee'))
)

呈现的选项包含 --------- 作为第一个可能的选项。我怎样才能摆脱它?

编辑: 我想出的唯一工作方式是(在 init 方法中):

tmp_choices = self.fields['event_form'].choices
del tmp_choices[0]
self.fields['event_form'].choices = tmp_choices

但这不是很优雅的方式:)

【问题讨论】:

  • event_form 字段在您的模型中是什么样的?
  • @Alasdair event_form = models.PositiveSmallIntegerField(max_length=2, choices=EVENT_FORM_CHOICES)
  • 在下面查看我的答案。顺便说一句,我认为max_length=2 对IntegerField 没有意义。

标签: django django-widget django-forms


【解决方案1】:

我遇到了类似的问题,但以这种方式修复了它。首先,下载并安装https://pypi.python.org/pypi/django-multiselectfield。如果您不知道如何安装,请看这里:django-multiselectfield can't install。然后,在models.py中:

from multiselectfield import MultiSelectField

CHOICES_FOR_ITEM_WITH_CHOICES = (
            ("choice 1", "choice 1"),
            ("choice 2", "choice 2"),
            ("choice 3", "choice 3"),
        )
class MyModel(models.Model):
        item_with_choices = MultiSelectField(max_length=MAX_LENGTH, null=True, blank=True)

在 admin.py 中:

from .forms import MyModelForm
class MyModelAdmin(admin.ModelAdmin):
    form = MyModelForm

    list_display = ('item_with_choices',)
    list_filter = ('item_with_choices',)
    search_fields = ('item_with_choices',)

admin.site.register(MyModel, MyModelAdmin)

在 forms.py 中(你可以随意命名):

from .models import MyModel

class MyModelForm(ModelForm):

    class Meta:
        model = MyModel
        fields = (
            'item_with_choices',
            )

    def clean(self):
        # do something that validates your data
        return self.cleaned_data

这建立在答案的基础上:Django Model MultipleChoice

【讨论】:

    【解决方案2】:

    Django 包含空白选项,因为该字段没有默认值。

    如果您在模型中设置了默认值,那么 Django 将不会包含空白选项。

    class MyModel(models.Model):
        event_form = models.PositiveSmallIntegerField(choices=EVENT_FORM_CHOICES, default=1)
    

    如果您不想在模型中设置默认值,则可以在模型表单中显式声明字段和选项,或者在模型表单的__init__ 方法中更改选项。

    【讨论】:

      【解决方案3】:

      更新

      类似的例子可能有用:

      country = ModelChoiceField(reference_class = Country, choices= country_choices, 
      required=True, empty_label=None,  widget=forms.Select)
      

      如果您想要一个解决方案客户端:

      <script>     
      $("#selectBox option[value='-----']").remove(); 
      </script>
      

      【讨论】:

      • initial: 无 - 是否正确插入?我收到错误“未定义名称'initial'”。
      • 不,它给了我一个错误:__init__() got an unexpected keyword argument 'initial'
      猜你喜欢
      • 2012-04-06
      • 2012-01-31
      • 2018-08-02
      • 2013-01-14
      • 2018-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多