【问题标题】:Django form choices groupby with CheckboxSelectMultiple widget带有 CheckboxSelectMultiple 小部件的 Django 表单选择 groupby
【发布时间】:2013-01-14 11:09:56
【问题描述】:

更新:看来我必须创建自定义小部件 (Grouping CheckboxSelectMultiple Options in Django)。完成后将包含最终代码。

我在 django 表单中设置了一个选择字段,类似于另一个 SO question

但是,我想将其设为 CheckboxSelectMultiple 小部件,但在 Meta 类中这样做会为整个组创建一个复选框。这是我需要在__init__ 中做的事情吗?如果需要,该怎么做?

class FooIterator(models.ModelChoiceIterator):
    def __init__(self, *args, **kwargs):
        super(models.ModelChoiceIterator, self).__init__(*args, **kwargs)
    def __iter__(self):
        for thing in MyModel.objects.all():
            yield (thing.name, [(x.id, x.name) for x in MyModel2.objects.filter(name=thing.name)])

class MyForm(ModelForm):
    def __init__(self, *args, **kwargs):
        super(MyForm, self).__init__(*args, **kwargs)
        self.fields['myField'].choices = FooIterator()
        for x in self.fields:
            self.fields[x].widget.attrs['class'] = 'input-block-level'

【问题讨论】:

    标签: django forms django-forms


    【解决方案1】:

    我假设您使用的是 modelForm。

    您可以修改init中的字段

    方法如下:

    class SomethingForm(forms.modelForm):
        def __init__(self, *args, **kwargs):
            super(SomethingForm, self).__init__(*args, **kwargs)
            self.field['myfieldname'] = forms.CharField(
                                        widget=forms.HiddenInput)
    

    【讨论】:

    • 这对我没有用。我想知道是否需要制作子小部件或以某种方式更改 'self.fields['myField'].choices' 级别的 iwdget
    【解决方案2】:

    看起来创建自定义小部件是可行的方法 - 根据Grouping CheckboxSelectMultiple Options in Django

    注意:我按照How to group the choices in a Django Select widget?删除了迭代器

    【讨论】:

      【解决方案3】:
      class MyForm(ModelForm):
          field_name = forms.MultipleChoiceField(required=False,
              widget=CheckboxSelectMultiple)
      
          def __init__(self, *args, **kwargs):
              super(MyForm, self).__init__(*args, **kwargs)
              self.fields['field_name'].widget.attrs['class'] = 'input-block-level'
              self.fields['field_name'].choices = self._get_choices()
      
          def _get_choices(self):
              return [(val.data1, val.data2) for val in Model.objects.filter()]
      

      【讨论】:

        猜你喜欢
        • 2017-01-03
        • 2012-03-19
        • 2014-05-26
        • 2017-01-08
        • 2010-10-14
        • 1970-01-01
        • 2011-12-16
        • 2012-01-31
        • 2010-10-19
        相关资源
        最近更新 更多