1

更新:看起来我将不得不创建自定义小部件(在 Django 中分组 CheckboxSelectMultiple 选项)。完成后将包含最终代码。

我已经以类似于另一个SO question的 django 形式设置了一个选择字段。

但是,我想让它成为一个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'
4

3 回答 3

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)
于 2013-01-30T15:40:05.397 回答
0

看起来创建自定义小部件是要走的路 - 根据Django 中的 Grouping CheckboxSelectMultiple Options

注意:我按照如何对 Django Select 小部件中的选择进行分组删除了迭代器?

于 2013-01-30T17:49:03.687 回答
0
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()]
于 2013-01-30T18:08:53.787 回答