django模板标签,获取与当前帖子标签相关的帖子

1 投票
1 回答
1271 浏览
提问于 2025-04-16 23:25

我正在用Django写一个博客,在每篇博客的底部,我想显示与我使用django-taggit附加的标签相关的最新5篇文章。

所以我想我需要把当前正在查看的博客文章传递给一个模板标签,这样它就能找到那些有相同标签的文章,或者相似的标签。为了简单起见,我们先找出那些共享第一个标签的文章。

这是我想到的代码:

from django.template import Library, Node
from django import template
from blog.models import Entry

register = Library()

class RecentContentNode(Node):
    def __init__(self, num, object, varname):
        self.object = template.Variable(object)
        self.num, self.varname = num, varname

    def render(self, context):
        object = self.object.resolve(context)
        tag_list = object.tags.all()
        tag_names = tag_list[0].name
        context[self.varname] = Entry.objects.filter(tags__name__in=[tag_names])[:self.num]
        return ''

@register.tag
def get_recent_related(parser, token):
    bits = token.contents.split()
    if len(bits) != 5:
        raise TemplateSyntaxError, "get_latest_entries tag takes exactly four arguments"
    if bits[3] != 'as':
        raise TemplateSyntaxError, "fourth argument to the get_recent tag must be 'as'"
    return RecentContentNode(bits[1], bits[2], bits[4])

但是它没有任何效果。我通过打印语句逐步调试,发现代码能走到RecentContentNode,能进入初始化部分,但就是进不了渲染方法。我没有看到任何错误或警告,所以我不知道发生了什么。不过我觉得问题可能出在变量解析上,因为我在网上看到其他人也遇到类似的问题,他们通常会在帖子里说自己解决了,但不说明具体怎么做的,所以我还是不太明白。

我是不是漏掉了什么明显的东西?或者有没有更好的方法呢……

1 个回答

2

你可以直接在上下文中传递列表。如果你使用的是基于类的通用视图,可以传递一个

def get_context_data(self, **kwargs):
    context_data = super(EntryView, self).get_context_data(**kwargs)
    related_entries = Entry.objects.filter(
        tags__name__in=list(self.object.tags.values_list('name', flat=True))
    ).exclude(id=self.object.id)
    context_data['related_entries'] = related_entries
    return context_data

https://docs.djangoproject.com/en/dev/topics/class-based-views/#adding-extra-context

你应该只在真正需要的视图中添加这些内容,并根据你需要展示的内容进行调整,而不是随便在任何视图的上下文中盲目添加这些内容。

撰写回答