Как использовать django-filter и django-mptt в шаблоне?
Я хочу использовать эти третьи приложения вместе в моем шаблоне (django-filter и django-mptt). Мне нужно, чтобы он искал по категориям в опубликованных работах, доступных на сайте, содержащихся в базе данных. Эти категории имеют дочерние категории, это хорошо работает в админке сайта, но не может сделать это в моем шаблоне. Думаю, это часто встречается на сайтах типа этого amazon.
Я пытался использовать recursetree и |tree_info, но это тоже не работает. Я буду рад, если вы мне поможете. Это заняло у меня много времени.
template.html
<form method="get">
<label for="{{ filter.form.subject.id_for_label }}" class="form-label">Subject:</label>
{% for su,structure in subject|tree_info %}
{% if structure.new_level %}<ul>
<li>{% else %}</li>
<li>{% endif %}
{{filter.form.su }}
{% for level in structure.closed_levels %}</li>
</ul>{% endfor %}
{% if filter.form.su.errors %}
<div class="alert alert-warning" role="alert">
{% for error in filter.form.su.errors %}
{{error}}
{% endfor %}
</div>
{% endif %}
{% if filter.form.su.help_text%}
<div class="form-text ms-2">{{filter.form.su.help_text}}</div>
{% endif %}
{% endfor %}
</div>
<button type="submit">Search</button>
</form>
{% for article in filter.qs %}
<div class="bg-light d-flex flex-column flex-wrap">
<a href="{{ article.get_absolute_url }}">{{ article.title|safe }}</a>
<a
href="{{ article.author.profile.get_absolute_url }}">{{ article.author.get_full_name|default:article.author.username }}</a>
<p><strong>Abstract:</strong> {{ article.abstract|safe|truncatewords_html:25 }}</p>
<p class="align-self-end"><i class="fas fa-eye"></i> {% get_hit_count for article %}<br> <i
class="far fa-arrow-alt-circle-down"></i>500
</p>
</div>
{% endfor %}
models.py
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")
def __str__(self):
return self.name
def save(self, *args, **kwargs):
if not self.slug:
self.slug = slugify(self.name)
return super().save(*args, **kwargs)
views.py
class ArticleListView(ListView):
model = Article
template_name = "template.html"
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context["filter"] = ArticleFilter(
self.request.GET, queryset=self.get_queryset()
)
context["profile"] = Profile.objects.all()
context["article"] = Article.objects.all()
context["subject"] = Subject.objects.all()
return context
filters.py
class ArticleFilter(django_filters.FilterSet):
class Meta:
model = Article
fields = {"subject", "article_type"}