Как использовать 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"}

Вернуться на верх