2

チェックボックスを使用してフォームをカスタマイズする方法がわかりません。基本的に、クエリセットでリストから2つだけ選択する必要があります。「filter(pk = 2、pk = 3)」を使用しようとしましたが、機能しません。また、「pk = 2」の選択をチェックして編集不可にし、「pk=3」を編集可能にしてデフォルトでチェックしないようにする必要があります。

私のフォーム(機能しません、filter(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 ユニオン演算子を使用してクエリセットを構築しようとしています -

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);

私はこのコードをテストしていませんが、私が提案していることは理解できるはずです。まだ見ていない場合は、 data-attributeをチェックしてください。これは非常に素晴らしいものです。

于 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 に答える