Категория и подкатегория для django-filter
Я хочу построить фильтр для категории и подкатегории. Фильтр работает достаточно хорошо, но я не знаю, как создать левое пространство для дочерних элементов (подкатегорий). Также я не знаю, как создать фильтр по ссылке. Например, я нажимаю на категорию "Природа" и эта категория содержит различные подкатегории. Короче говоря, у меня два вопроса:
- How to build space for children (subcategory)?
- how to present categories and subcategories by link? I will be happy of any answer. My code which I tried to use Django-MPTT. But I have error when I use "tree info" and "recursetree" - "'BoundWidget' object has no attribute '_mptt_meta'"
template.html
<form method="get" class="d-flex flex-column">
{% for su,structure in filter.form.subject|tree_info %}
{% if structure.new_level %}<ul>
<li>{% else %}</li>
<li>{% endif %}
{{ su }}
{% for level in structure.closed_levels %}</li>
</ul>{% endfor %}
{% endfor %}
OR
{% recursetree filter.form.subject %}
<li>
{{ node }}
{% if not node.is_leaf_node %}
<ul class="children">
{{ children }}
</ul>
{% endif %}
</li>
{% endrecursetree %}
<button class="btn-primary mt-2" type="submit">Search</button>
</form>
models.py
class Book(models.Model):
title = models.CharField(max_length=255, db_index=True)
author = models.ForeignKey(
"users.CustomUser", on_delete=models.SET_NULL, null=True, db_index=True
)
subject = TreeManyToManyField("Subject")
class Subject(MPTTModel):
name = models.CharField(
max_length=100,
unique=True,
verbose_name=_("category name"),
help_text=_("format: required, max-100"),
)
slug = models.SlugField(
max_length=150,
null=False,
unique=False,
blank=False,
verbose_name=_("category safe URL"),
help_text=_(
"format: required, letters, numbers, underscore, or hyphens"),
)
parent = TreeForeignKey(
"self",
on_delete=models.PROTECT,
related_name="children",
null=True,
blank=True,
unique=False,
verbose_name=_("parent of category"),
help_text=_("format: not required"),
)
class MPTTMeta:
order_insertion_by = ["name"]
class Meta:
verbose_name = _("article category")
verbose_name_plural = _("article categories")
views.py
def ArticleListView(request):
article = Article.objects.all()
filter = ArticleFilter(request.GET, queryset=article)
subjects = Subject.objects.all()
form = PostSearchForm
context = {"filter": filter, "article": article}
return render(request, "articles/articles.html", context)
filters.py
class ArticleFilter(django_filters.FilterSet):
subject = django_filters.ModelMultipleChoiceFilter(
queryset=Subject.objects.all(), widget=forms.CheckboxSelectMultiple())
class Meta:
model = Article
fields = {"subject"}