【问题标题】:Filter many-to-many multiple select field过滤多对多多选字段
【发布时间】:2011-05-30 11:07:28
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 您想在第一个字段更改时动态填充第二个字段(使用 ajax 吗?)?如果您有分层模型,我还鼓励您使用 django-mptt,它为您提供了一组强大且高性能的方法,例如。得到一个类别的孩子! (github.com/django-mptt/django-mptt)

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


【解决方案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传递给form init方法,你只会得到对应的子类

【讨论】:

    猜你喜欢
    • 2018-06-07
    • 2015-07-18
    • 1970-01-01
    • 1970-01-01
    • 2020-03-20
    • 2018-08-22
    • 1970-01-01
    • 2016-12-13
    • 2013-01-22
    相关资源
    最近更新 更多