9阅网

您现在的位置是:首页 > 知识 > 正文

知识

django - 如何在django中使用django-taggit来过滤文章。

admin2022-11-04知识17

目前,我还在学习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>
      Tags :
      {% for tag in post.tags.all %}
         <a href="{% url 'tagged' tag.slug %}">{{ tag.name }}</a>
      {% endfor %}
    </div>
</div>


【回答】:

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

由于我的文章中有多个标签。__intags 必须 列表中.

这是我的 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.