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 class="tags-cloud">
Tags :
{% for tag in post.tags.all %}
<a href="{% url 'tagged' tag.slug %}">{{ tag.name }}</a>
{% endfor %}
</div>
</div>
解决方案
我通过过滤标签解决了这个问题views.py
。
因为我的帖子中有多个标签。所以__in
andtags
必须在列表中。
这是我的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
.
推荐阅读
- javascript - 路由器出口外的角子路由元素
- mysql - 如何插入从节点快递到 MySQL db 的多个列
- sapb1 - 如何将销售订单数据插入到用户定义的表中
- mockito - Mockito.spy 执行不同的代码库
- excel - Excel - 生成显示满足多种形式标准的单元格的列表
- javascript - 为什么我的子菜单与另一个子元素重叠?
- python - 有没有更简单的方法来制作 4 行 15 个精灵?
- python - 在 PySpark 中 Group By 之后从可用行创建 JSON 结构
- reactjs - 如何在使用下一个路由器时解决未处理的运行时错误
- node.js - Firestore Timestamp 变量抛出 TypeError: startDate.toMillis is not a function