2

我没有关于如何使用复选框自定义表单的线索。基本上我只需要在查询集中选择一个列表的两个选项,我尝试使用“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)

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

最好的祝福,

4

2 回答 2

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的话,Martin在评论中的建议可能就足够了——

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

可编辑的复选框

我认为在使复选框可编辑和预选时,您可能需要使用 javascript。也许将数据属性添加到小部件,然后创建一个基于数据属性操作复选框的 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);

我没有测试过这段代码,但它应该让你了解我的建议。如果您还没有遇到过数据属性,请查看它 - 它非常棒。

于 2013-02-05T11:15:08.277 回答
1

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

这里有这样的东西:如何修改 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
于 2013-02-05T10:21:07.827 回答