2

我有一个与另一个对象(类别)具有多对多关系的对象(书)。

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

我想显示一个带有两个 ChoiceFields 的表单作为多项选择。一个用于仅显示类别的类别,另一个用于先前所选类别的子类别。

我不知道如何过滤上面选择的类别中可用的子类别。那可能吗?

到目前为止,我只能过滤不包括类别的子类别(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

您可以使用表单 init 方法使用相应的类别填充子类别选择:

表格.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)

视图.py

 cat_subcat_form = CatSubcatForm(parent_category_id)

用户选择父类后,你必须通过ajax请求将父类id传递给form init方法,你只会得到相应的子类

于 2010-12-26T22:39:48.557 回答