1

私はdjangoでブログを書いていますが、ブログエントリの下部に、django-taggitを使用して付けたタグに関連する最新の5つのエントリを表示したいと思います。

そのため、現在のブログエントリ(表示しているもの)を、同じtaggit-tagsを持つエントリを取得する、または十分に近いtemplatetagに渡す必要があると考えました。しかし、簡単に始めて、最初の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メソッドには到達しないことがわかります。エラーや警告が表示されないので、どうなるかわかりません。しかし、ネット全体で同様の問題を抱えている他の人々を見るので、問題は変数/解決だと思いますが、彼らはしばしばそれを修正したと言って投稿に応答しますが、方法ではないので、賢明ではありません。

私が見逃した明らかな何か?またはもっと良い方法がありますか..

4

1 に答える 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

これは、本当に必要なビューにのみ追加し、表示する必要があるものに合わせて調整する必要があります。ビューが何であれ、ビューのコンテキストでこれを盲目的に追加しないでください。

于 2011-08-12T03:24:54.413 に答える