Как я могу отфильтровать теги записей в Django - PullRequest
0 голосов
/ 13 февраля 2020

У меня есть веб-сайт типа блога, где пользователи могут добавлять теги к своим сообщениям, и я хочу, чтобы люди могли фильтровать по тегам. Вот мой models.py

class Tag(models.Model):
    name = models.CharField(max_length=150,unique=True)

    def __str__(self):
        return self.name

class Post(models.Model):
    author = models.ForeignKey(User,related_name='posts',on_delete=models.CASCADE)
    title = models.CharField(max_length=75)
    text = models.TextField(null=True,blank=True)
    tag = models.ManyToManyField(Tag,related_name='tags',blank=True)

Я вырезал множество не относящихся к делу полей модели, чтобы вы не были засыпаны большим количеством текста. Теперь вот мой views.py

class TagFilterView(ListView):
    model = Post
    template_name = 'mainapp/tags_.html'

    def get_queryset(self):
        object_list = Post.objects.filter(tags=tag).distinct()
        return object_list

Вот мой шаблон URL

path('tag/<int:pk>/',views.TagFilterView.as_view(),name='tag_view'),

И, наконец, вот файл HTML

{% extends 'mainapp/base.html' %}

{% block content %}
    <h1>Tags</h1>
    {% for post in object_list %}
        <h2>{{ post }}</h2>
    {% endfor %}
{% endblock content %}

У меня есть перепробовал много разных комбинаций фильтров и тегов фильтров, но это, кажется, самое близкое, я думаю. Поэтому в основном я хочу знать, как я могу фильтровать посты по указанным c тегам, которые они связывают с ними. Так, например, если у поста есть программный тег, а у меня от go до /tag/1 или что-то подобное, он будет фильтровать, поэтому будут показаны только посты с программным тегом.

Что является самым простым способ сделать это?

1 Ответ

0 голосов
/ 21 февраля 2020

Я не уверен, где вы получаете тег, но вот что я буду делать.

class TagFilterView(ListView):
   ...

   def get_queryset(self):
        return super().get_queryset().filter(
            tags__id=self.kwargs['id']).distinct()
...