django templatetag,获取与当前帖子的taggit-tags相关的帖子

时间:2011-08-11 20:38:12

标签: python django django-templates django-taggit

我正在用django写博客,在博客条目的底部,我想显示相对于我使用django-taggit附加的标签的5个最新条目。

所以我想我需要将当前的博客条目(我们正在查看的那个)传递给一个模板标签,该模板标签将检索具有相同taggit标签的条目,或者足够接近。但是让我们开始简单并说出检索共享第一个taggit-tag的条目。

这就是我想出的:

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])

但它没有做任何事情。使用print语句逐步执行它我可以看到它通过init进入RecentContentNode但不进入render方法。我没有错误或警告,所以我不知道会发生什么。但我认为这是变量/解决问题,因为我看到其他人通过网络有类似的问题,但他们经常回复帖子说他们修复它,但不是如何,所以我不明智。

我错过了一些明显的东西?还是有更好的方法..

1 个答案:

答案 0 :(得分: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

您应该只在您真正需要的视图中添加它,并根据您需要显示的内容进行定制,而不是盲目地在任何视图的上下文中添加它。无论视图是什么。