2011-08-11 16 views
1

私はdjangoでブログを書いています。ブログのエントリの最下部には、django-taggit 。django templatetag、現在の投稿のtaggit-tagsに関連する投稿を取得します

私は現在のブログエントリ(私たちが見ているもの)をtemplatetagに渡して、同じtaggitタグを持つエントリを取得するか、または十分に近いものにする必要があると考えました。しかし、簡単に始めて、最初のtaggitタグを共有するエントリを取得するようにしてください。

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メソッドを通して、しかしrenderメソッドにではなく、RecentContentNodeに到達するのを見ることができます。私はエラーや警告を受けないので、何が起こるかわからない。しかし、私はそれが変数/解決策だと思うので、私は他の人々と同様の問題を抱えているネットを参照してください、しかし、彼らはしばしば、

明らかに私は見逃しましたか?またはより良い方法があります。

答えて

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

を渡しますどのような視点であっても、どの視点からでも見ることができます。

+0

あなたは正しいです。私は訂正した。 – rewritten

+0

完全に動作しますが、この方法を使用するにはどうすればよいのですか?セキュリティリスクはありますか?それともあまりにも多くの余分なデータベースクエリ/オーバーヘッドを追加しますか? – mXed

+0

ポイントはオーバーヘッドです。コンテキスト情報に基づいてrelated_entriesを含めるかどうかを選択できる場合は、1つまたは2つのクエリを保存します。 – rewritten

関連する問題