【问题标题】:Django - How to list blog items by their common tagsDjango - 如何按常用标签列出博客项目
【发布时间】:2019-08-15 09:41:16
【问题描述】:

我是一个 django/python 初学者,正在写一个基本的博客并尝试按标签列出项目。我可以从管理面板为帖子添加标签,但无法找出允许我按特定标签显示帖子的正确代码。

我尝试实施了许多在网上找到的解决方案,但我最终列出了所有帖子,没有帖子,或者出现错误。

这是我的models.py的相关部分:

... 
class Tag(models.Model):
    name = models.CharField(max_length=200, unique=True)
    slug = models.SlugField(max_length=200, unique=True)

    def __str__(self):
        return self.name

class Post(models.Model):
    title = models.CharField(max_length=200, unique=True)
    slug = models.SlugField(max_length=200, unique=True)
    author = models.ForeignKey(User, on_delete=models.CASCADE, related_name='blog_posts')
    tags = models.ManyToManyField(Tag)
    updated_on = models.DateTimeField(auto_now=True)
    content = RichTextUploadingField(config_name="default", null=True, blank=True)
    created_on = models.DateTimeField(auto_now_add=True)
    status = models.IntegerField(choices=STATUS, default=0)

    class Meta:
        ordering = ['-created_on']

    def __str__(self):
        return self.title

观看次数:

...
class TagPage(generic.ListView):
        model = Tag
        template_name = 'tag_list.html'

和网址:

urlpatterns = [
    ...
    path('tag/<slug>/', views.TagPage.as_view(), name='tag')
]

如果有人对需要哪些代码有任何想法,我们将不胜感激。

【问题讨论】:

    标签: python django tags blogs


    【解决方案1】:

    urls.py

    path('tag/<int:tag_id>/', views.PostView.as_view() 
    

    views.py

    class PostView(generic.ListView):
        model = Post
    
        def get_queryset(self, *args, **kwargs):
            qs = super().get)queryset(a*args, **kwargs)
            qs.filter(tags__id=int(self.kwargs['tag_id']))
            return qs
    

    post_list.html

    {% for object in object_list %}
       {{ object }}
    {% endfor %}
    

    【讨论】:

    • 感谢您的回答。我似乎无法解决我的问题。当我访问任何整数的页面时,我会得到一个包含我所有帖子标题的列表。
    • 进行了编辑:试试这个:qs.filter(tags__id=int(self.kwargs['tag_id']))
    • 我已经尝试了编辑后的代码,但它似乎仍在调用我所有帖子标题的列表。
    • 它应该创建一个Posts 列表,其中包含您已通过的Tag
    • 创建的列表看起来是每个帖子的标题,而不仅仅是那些带有特定标签的帖子。
    【解决方案2】:

    首先在您的应用文件夹中创建一个名为serializers.py 的文件。添加这行代码:

    from rest_framework import serializers
    from .models import Tag
    class TagSerializer(serializers.ModelSerializer):
        class Meta:
            Model = Tag
            fields = '__all__'
    

    然后像这样编辑您的视图:

    class TagView(generics.ListAPIView): 
        serializer_class = TagSerializer
    
        def get_queryset(self):
            slug = self.kwargs['slug']
            return Tag.objects.filter(slug=slug)
    

    【讨论】:

    • 感谢您的回答。访问 url 时出现错误:“TypeError: 'Tag' object is not iterable”。这是我尝试过的 url 模式: path('tag//', views.TagView.as_view())
    • 我编辑了帖子并将标签替换为标签。试试这个!我希望这会有所帮助。
    • 谢谢。我已经尝试了编辑后的代码,但我得到了同样的错误。
    • 好的,所以我再次编辑了代码并用过滤器替换了get。我认为问题出在那个
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-18
    • 1970-01-01
    • 2013-03-31
    • 2021-03-14
    • 2016-11-08
    • 1970-01-01
    相关资源
    最近更新 更多