Django - 如何自定义表单中的复选框?

时间:2013-02-05 10:14:30

标签: django django-forms

我没有关于如何使用复选框自定义表单的线索。基本上我需要在查询集中选择列表中的两个选项,我试图使用“filter(pk = 2,pk = 3)”但它不起作用。我还要检查“pk = 2”选项并且不可编辑,“pk = 3”可编辑,默认情况下不选中。

我的表单(不起作用,过滤器(pk = 2,pk = 3)无效):

class PrimaryCategoryForm(forms.ModelForm):
    primarycategorytype = forms.ModelMultipleChoiceField(queryset=PrimaryAdCategoryType.objects.filter(pk=2, pk=3), required=True, widget=forms.CheckboxSelectMultiple)

有关如何实现这一目标的任何线索?

最诚挚的问候,

2 个答案:

答案 0 :(得分:2)

尝试使用pythons union运算符构建查询集 -

class PrimaryCategoryForm(forms.ModelForm):
    set_1 = PrimaryAdCategoryType.objects.filter(pk=2)
    set_2 = PrimaryAdCategoryType.objects.filter(pk=3)
    qs = set_1 | set_2
    primarycategorytype = forms.ModelMultipleChoiceField(queryset=qs, 
                                                        required=True,
                                                        widget=forms.CheckboxSelectMultiple)

|运算符正在创建一个新集,其中包含set_1中的所有项目和set_2中的所有项目。

更新

虽然上述方法将支持创建复杂的集合。如果你只是想选择一些pk,那么马丁在评论中的建议可能就足够了 -

class PrimaryCategoryForm(forms.ModelForm):
    qs=PrimaryAdCategoryType.objects.filter(pk__in=[2,3])
    primarycategorytype = forms.ModelMultipleChoiceField(queryset=qs, 
                                                        required=True,
                                                        widget=forms.CheckboxSelectMultiple)

可编辑的复杂文件

我认为在复选框可编辑和预选时,您可能需要使用javascript。也许add data-attributes to the widget,然后创建一个jquery函数,根据数据属性操作复选框。像 -

这样的东西
attrs = {'data-selected-value': 2, 'data-readonly-value': 2}
primarycateogrytype = forms.ModelMultipleChoiceField(attrs=attrs)

然后在javascript中 -

var readonlyCheckboxValue = $('#your_mulliplecheckboxselect).data('selected-value');
var $readonlyCheckbox = $('#your_multiplecheckboxselect .input[value=readonlyCheckboxValue]');
$readonlyCheckbox.attr('readonly', true);

我没有测试过这段代码,但它应该让你知道我的建议。如果您还没有看到data-attribute,请查看它 - 这非常棒。

答案 1 :(得分:1)

您可能需要表单本质上是动态的。您需要覆盖该类的__init__方法。

这里有类似的内容:How to Modify Choices of ModelMultipleChoiceField

一个例子:

class ServiceStartForm(forms.Form):
    serviceList = service.models.Service.objects.all()
    print serviceList.count()
    b = {}
    for aService in serviceList:
        b[aService.id] = aService.name
    c = b.items()
    print "Within the form, ", serviceList.count()
    serviceChoice = forms.ChoiceField(choices=c, widget=forms.Select())
    input_directory = forms.CharField(max_length=200)
    output_directory = forms.CharField(max_length=200)

    def __init__(self, *args, **kwargs):
        super(ServiceStartForm, self).__init__(*args, **kwargs)
        serviceList = service.models.Service.objects.all()
        b = {}
        for aService in serviceList:
            b[aService.id] = aService.name
        c = b.items()
        self.fields["serviceChoice"].choices = c