过滤多对多选择字段

时间:2010-12-24 16:27:08

标签: django django-admin django-forms many-to-many django-widget

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

'类别'也用于渲染子类别。类别和子类别之间的区别在于类别具有“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))

1 个答案:

答案 0 :(得分:1)

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

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方法,并且您将只获得相应的子类别