2013-02-05 37 views
2

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

我的形式(不工作,过滤器(PK = 2,PK = 3)是无效的):

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

就如何实现这一目标任何线索?

最好的问候,

+1

queryset = PrimaryAdCategoryType.objects.filter(pk__in = [2,3])? – Martin

回答

2

试图建立使用蟒蛇联合操作的查询集 -

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

UPDATE

虽然上面的方法将支持创建复杂的集合。马丁的意见建议可能是足够的,如果你只是想挑几个PK的 -

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

EDITABLE复选框

我认为,当涉及到使复选框可编辑的,预先设定你可能需要求助于的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

它可能需要的形式是动态的性质。您需要覆盖该课程的__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