django - 如何在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>
Tags :
{% for tag in post.tags.all %}
<a href="{% url 'tagged' tag.slug %}">{{ tag.name }}</a>
{% endfor %}
</div>
</div>
【回答】:
我已经解决了这个问题,通过过滤标签从 views.py
.
由于我的文章中有多个标签。__in
和 tags
必须 列表中.
这是我的 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
.