使用模板標籤可能是我在這裏要採用的路線。我遇到過類似的情況,因此我在同一頁面上以不同格式呈現多次日曆信息。我處理它的方式是將查詢的數據傳入請求上下文,然後簡單地使用該查詢集作爲模板標記的參數。其結果是,你可以用模板語法像這樣結束:
查看
def my_view(request, *args, **kwargs):
yearly_sales_qs = SaleRecord.objects.filter(param=value)
monthly_sales_qs = SalesRecord.objects.filter(param=foo)
return render_to_response(..., locals(), ...)
模板
{% load data_tags %}
<div class="year">
{% render_data_table for yearly_sales_qs %}
{% render_bar_chart for yearly_sales_qs %}
</div>
<div class="month">
{% render_data_table for monthly_sales_qs %}
{% render_bar_chart for monthly_sales_qs %}
</div>
那麼,如何才能讓類似的東西?首先檢查Custom template tags and filters上的Django文檔。開始比Django的其他部分要困難得多,但一旦得到它,這很容易。
- 首先在應用程序文件夾中創建一個文件夾「templatetags」。
- 做一個空白文件「初始化 py」爲在新的文件夾
- 添加的位置是templatetags文件夾到
TEMPLATE_DIRS
設置在settings.py
(如果它尚不存在)
因爲我們」會被使其中的一些,我們可以做一個基本模板標籤,我們將繼承關的實現了我們的基本功能...
data_tags.py(存儲templatetags
文件夾內)
class DataForTag(tempalte.Node):
@classmethod
def handle_token(cls, parser, token, template):
tokens = token.contents.split()
if tokens[1] != 'for':
raise template.TemplateSyntaxError("First argument in %r must be 'for'" % tokens[0])
if len(tokens) == 3:
return cls(queryset=parser.compile_filter(tokens[2]), template=template)
else:
raise template.TemplateSyntaxError("%r tag requires 2 arguments" % tokens[0])
def __init__(self, queryset=None, template=None):
self.queryset = queryset
self.template = template
def render(self, context):
return render_to_string(self.template, {'queryset':self.queryset})
然後,我們可以作出這樣的處理,無論我們需要他們的個人標籤...
@register.tag
def render_bar_chart(parser, token):
return DataForTag.handle_token(parser, token, 'data/charts/barchart.html')
@register.tag
def render_pie_chart(parser, token):
return DataForTag.handle_token(parser, token, 'data/charts/piechart.html')
@register.tag
def render_data_table(parser, token):
return DataForTag.handle_token(parser, token, 'data/table.html')
感謝您的答案,斯內德。 Nr 1:那將起作用,但我的直覺說應該有更多'estetic'解決方案。 Nr2:多數民衆贊成在我正在尋找。這解決了探頭我有 – Mark 2010-04-28 01:04:24