1

私はnews.articleとportfolio.entryの2つのモデルを持っています。どちらのモデルにも、「is_campaign」を true に設定するための BooleanField があります。

最新のキャンペーン記事を取得できるように、カスタムのテンプレートタグを作成しようとしています (1 つしかないはずです)。

これが私のテンプレートタグです:campaign_article.py

from itertools import chain
from django import template

from news.models import Article
from portfolio.models import Entry

register = template.Library()

def get_campaign():
        #Get the newest news article with is_campaign=True
        article = Article.objects.filter(is_campaign=True).order_by('-pub_date')[:1]

        #Get the newest portfolio entry with is_campaign=True
        portfolio = Portfolio_entry.objects.filter(is_campaign=True).order_by('-pub_date')[:1]

        #combine article, and entry and display only the newest
        campaign_article = list(chain(article, portfolio))[:1]


        return {'campaign_article': campaign_article}



register.tag('campaign', get_campaign)

テンプレートでこれを試しました:

{% load campaign_article %}
{% for campaign_article in campaign %}

{{ campaign_article.id }}

{% endfor %}

しかし、出力が得られません。これは間違った方法ですか?

4

2 に答える 2

1

assignment_tag一般的なタグではなく、作成する必要があります。したがって、タグを次のように更新できます。

def get_campaign():
    #your stuff
    ....

    return campaign_article

register.assignment_tag(get_campaign, name='campaign')

テンプレートを次のように更新します。

{% load campaign_article %}
{% campaign as campaign_list %} {# loads the tags and creates campaign_list context variable #}
{% for campaign_article in campaign_list %}
    {{ campaign_article.id }}
{% endfor %}
于 2012-10-15T14:03:38.057 に答える
0

やりたいことをするためにテンプレートタグを作成する必要はありません。コンテキストプロセッサについて読む:

def get_campaign(request): # this is your context processor            
        # ...    
        return {'campaign_article': campaign_article}

あなたの見解では:

def some_view(request):
    # ...
    c = RequestContext(request, {
        'foo': 'bar',
    }, [get_campaign]) # attach your context processor to template context
    return HttpResponse(t.render(c))

UPD:各ページにデータを表示する必要がある場合は、設定ファイルでコンテキストプロセッサをグローバルとして登録できます。テンプレートコンテキストプロセッサの設定を参照してください。

TEMPLATE_CONTEXT_PROCESSORS = (..., "myapp.context_processors.get_campaign")

campaign_articleDjangoは、各テンプレートレンダリングに変数を自動的に追加します。

于 2012-10-15T13:29:25.483 に答える