我没有关于如何使用复选框自定义表单的线索。基本上我需要在查询集中选择列表中的两个选项,我试图使用“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)
有关如何实现这一目标的任何线索?
最诚挚的问候,
答案 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