首页 > 解决方案 > 如何在 django 中使用 django-taggit 按标签过滤帖子

问题描述

目前,我仍在学习 Django 并使用 Django 2.2 创建我的博客。但不知何故,当我使用 django-taggit 时出现错误。

如何按标签过滤帖子?

我已经阅读了文档,但没有完全涵盖如何将其实施到实际项目中。

这是我的代码:

我尝试了几种不同的方法,我仍在从 StackOverflow 中搜索,但仍然没有答案。

的结果与/blog/tag/post-tagged的相同/blog。那么我该如何过滤呢views.py?或者也许来自blog.html

所以结果/blog/tag/post-tagged仅来自标记的帖子。

这是我的代码:

models.py

...

from taggit.managers import TaggableManager



"Post Model"
class Post(models.Model):
    author = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    slug = models.SlugField(max_length=100, null=True, blank=True, unique=True)
    title = models.CharField(max_length=200)

    tags = TaggableManager(blank=True)
...

views.py

def blogIndex(request):
    posts = Post.objects.all().order_by("-created_date")[0:4]
    context = {"posts": posts,}
    return render(request, 'blog.html',  context)



def Tagging(request, slug):

    tags = Tag.objects.filter(slug=slug)
    posts = Post.objects.all().order_by("-tags")

    context = {
        'tags': tags,
        'posts': posts,
    }
    return render(request, 'blog.html', context)

urls.py

path("tag/<slug:slug>/", views.Tagging, name='tagged'),

我的blog.html

<div id="tags-middle">
   <div class="tags-cloud">
      Tags :
      {% for tag in post.tags.all %}
         <a href="{% url 'tagged' tag.slug %}">{{ tag.name }}</a>
      {% endfor %}
    </div>
</div>

标签: djangodjango-modelsdjango-templatesdjango-taggit

解决方案


我通过过滤标签解决了这个问题views.py

因为我的帖子中有多个标签。所以__inandtags必须在列表中

这是我的views.py

tags = Tag.objects.filter(slug=slug).values_list('name', flat=True)
posts = Post.objects.filter(tags__name__in=tags)

基本上,正如文档所说,我们可以使用字符串进行过滤,就像:

posts = Post.objects.filter(tags__name__in=["Lorem"])

但它只需要一个字符串。

如果我尝试使用多个字符串,["Lorem", "Ipsum"]它只会在/blog/tag/lorem.


推荐阅读