Фильтровать поле множественного выбора «многие ко многим»

У меня есть объект (книга) с отношением «многие ко многим» с другим объектом (категория).

«Категория» также используется для отображения подкатегорий. Разница между категорией и подкатегорией заключается в том, что у категории есть '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))

person user553417    schedule 24.12.2010    source источник
comment
Вы хотите динамически заполнять второе поле при изменении первого (с помощью ajax?)? Если у вас есть иерархическая модель, я также рекомендую вам использовать django-mptt, который предоставляет вам набор мощных и эффективных методов, например. получить детей категории! (github.com/django-mptt/django-mptt)   -  person Bernhard Vallant    schedule 24.12.2010


Ответы (1)


вы можете использовать метод инициализации формы для заполнения подкатегорий, выбранных соответствующими категориями:

формы.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 в метод инициализации формы, и вы получите только соответствующие подкатегории

person Thomas Kremmel    schedule 26.12.2010