0

私はこのタスクの最良の解決策を探しています。私はforms.pyにフォームの単純なクラスを持っています:

class CategoriesForm(Form):
    RADIO_CHOICES = (
        ('c1', _("C1")),
        ('c2', _("C2")),
        ('c3', _("C3")),
        ('c4', _("C4")),
    )
    category = forms.ChoiceField(widget=forms.RadioSelect(),choices=RADIO_CHOICES)

    subcategory_c1 = forms.ModelChoiceField(queryset=Category.objects.filter(type="c1", public=True), empty_label="", label = "hhh")
    subcategory_c2 = forms.ModelChoiceField(queryset=Category.objects.filter(type="c2", public=True), empty_label="", label = "rrr")
    subcategory_c3 = forms.ModelChoiceField(queryset=Category.objects.filter(type="c3", public=True), empty_label="", label = "aaa")
    subcategory_c4 = forms.ModelChoiceField(queryset=Category.objects.filter(type="c4", public=True), empty_label="", label = "eeee")

    def __init__(self, *args, **kwargs):
        super(CategoriesForm, self).__init__(*args, **kwargs)

        self.fields["subcategory_c1"].required = False
        self.fields["subcategory_c2"].required = False
        self.fields["subcategory_c3"].required = False
        self.fields["subcategory_c4"].required = False

これはドラフトの一部にすぎません。

フォームの動作は次のようになります。無線選択フィールドからC1カテゴリを選択する場合、subcategory_c1が必要です。C2カテゴリを選択する場合、subcategory_c2は必須であり、他のサブカテゴリフィールド(C1、C3、C4)はオプションである必要があります。私の説明が明確であることを願っています。

テンプレートのフォームのドラフト:

field category (RadioSelect: C1, C2, C3, C4) <<required>>
field subcategory_c1 (Select: ---, a,b,c,d) <<required only if user checked C1>>
field subcategory_c2 (Select: ---, a,b,c,d) <<required only if user checked C2>>
field subcategory_c3 (Select: ---, a,b,c,d) <<required only if user checked C3>>
field subcategory_c4 (Select: ---, a,b,c,d) <<required only if user checked C4>>

よろしくお願いします。

4

1 に答える 1

1

新しい選択肢が追加された場合に備えて、ソリューションには多くのことを行う必要があります。

よりクリーンな方法は、subcategory可能なすべての選択肢を含む1つのフィールドを作成し、クライアント側でJavaScriptを使用してそれらをフィルタリングすることです。jsを使用しないユーザーのフォールバックとして、適切に分類されたすべての選択肢があるはずです。

動的に変化する選択肢を持つフィールドが必要なので、このソリューションは理にかなっています-クライアント側の魔法の仕事のように見えます。:)

于 2012-11-19T02:40:41.737 に答える