2012-10-15 36 views
1

我有兩個模型news.article和portfolio.entry。兩種型號都有一個BooleanField,用於將「is_campaign」設置爲true。將兩個查詢集合到一個模板標記中

我試着去編寫自定義templatetag這樣我就可以得到最新的競選文章(應該只有一個)

這裏是我的templatetag: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 %} 

但我沒有得到任何輸出。這是錯誤的方法嗎?

回答

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 %} 
+0

是的,這個工程!謝謝! –

0

你不需要創建模板標籤來做你想做的。閱讀關於context processor

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設置。

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

Django會自動將變量campaign_article添加到每個模板呈現。

+0

不知道如果多數民衆贊成的最佳方式,如果我想在頁腳每一頁上這項運動? –

+0

@ Garreth00,請參閱我的答案更新。 – defuz