如何使用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的标签来解决此问题。

由于我的帖子中有多个标签。因此__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上的空白页。

在我的个人博客中,我正在执行以下操作以通过标签过滤帖子:

urls.py中:

...
path('tag/<tag>', views.tag, name='tag'),
...

views.py

from django.shortcuts import render    
...
def tag(request, tag):
    "This page shows all posts with the related tag"
    
     posts = Post.objects.filter(tags__name=tag)
     return render(request, 'blog/tag.html', {'tag': tag, 'posts': posts})
    

这样,您可以拥有一个blog/tag.html模板类似:

<h2>List of posts of the tag "{{ tag }}"</h2>
{% if posts %}
<ul>
{% for post in posts %}
// displays whatever you want about the post
{% endfor %}
</ul>
{% else %}
<p>No post related to that tag yet.</p>
{% endif%}

最新更新