2

別のオブジェクト (Category) と多対多の関係を持つオブジェクト (Book) があります。

「Category」は、サブカテゴリのレンダリングにも使用されます。カテゴリとサブカテゴリの違いは、カテゴリには「category_parent=None」があるのに対し、サブカテゴリには親としてカテゴリがあることです。

--models.py--
class Category(models.Model):
    name = models.CharField(max_length=150, blank=True, null=True)
    category_parent = models.ForeignKey("Categoria", blank=True, null=True)

class Book(models.Model):
    title = models.CharField("Title",max_length=150)
    category = models.ManyToManyField("Category", blank=True, null=True)

複数選択として 2 つの ChoiceFields を持つフォームを表示したいと思います。1 つはカテゴリのみを表示するカテゴリ用で、もう 1 つは以前に選択したカテゴリのサブカテゴリ用です。

上で選択したカテゴリで利用可能なサブカテゴリをフィルタリングする方法がわかりません。それは可能ですか?

これまで、カテゴリ (category_parent=None) を除くサブカテゴリのみをフィルタリングできましたが、既に選択されているカテゴリでフィルタリングすることはできませんでした。

--forms.py--
class CatSubcatForm(forms.Form):
    category = forms.ModelChoiceField(Category.objects.filter(category_parent=None))
    subcategory = forms.ModelChoiceField(Category.objects.exclude(category_parent = None))
4

1 に答える 1

2

form initメソッドを使用して、選択したサブカテゴリに対応するカテゴリを設定できます。

forms.py

class CatSubcatForm(forms.Form):
    category = forms.ModelChoiceField(Category.objects.filter(category_parent=None))
    subcategory = forms.ModelChoiceField(queryset=Category.objects.none(), required=False)

    def __init__(self, parent_category_id, *args, **kwargs):
        super(CatSubcatForm, self).__init__(*args, **kwargs) 
        self.fields['subcategory'].queryset = Category.objects.filter(pk=parent_category_id)

views.py

 cat_subcat_form = CatSubcatForm(parent_category_id)

ユーザーが親カテゴリを選択した後、ajaxリクエストで親カテゴリIDをフォームのinitメソッドに渡す必要があり、対応するサブカテゴリのみを取得します

于 2010-12-26T22:39:48.557 に答える