Фильтровать поле множественного выбора «многие ко многим» - PullRequest
1 голос
/ 24 декабря 2010

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

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

1 голос
/ 27 декабря 2010

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

...