2010-04-23 78 views
17

我有一個自定義模板標籤:Django - 使用模板標籤和'with'?

def uploads_for_user(user): 
    uploads = Uploads.objects.filter(uploaded_by=user, problem_upload=False) 
    num_uploads = uploads.count() 
    return num_uploads 

,我想要做這樣的事情,這樣我就可以適當地變複數:

{% with uploads_for_user leader as upload_count %} 
    {{ upload_count }} upload{{ upload_count|pluralize }} 
{% endwith %} 

然而,uploads_for_user leader沒有在這方面的工作,因爲'with'標籤需要單個值 - Django返回:

TemplateSyntaxError at /upload/ 
u'with' expected format is 'value as name' 

任何想法我怎麼能得到這個?

回答

22

你可以把它變成一個過濾器:

{% with user|uploads_for as upload_count %} 
+0

啊 - 我明白了。謝謝:) – AP257 2010-04-28 09:37:30

+3

Django 1.5+可以讓你更簡潔地做到這一點。 {%with upload_count = user | uploads_for%} [django with](https://docs.djangoproject.com/en/1.5/ref/templates/builtins/#with) – 2015-04-21 00:39:12

9

雖然過濾器仍然能工作,目前這個問題的答案是使用assignment tags,在Django 1.4中引入。

因此,解決方案是非常類似於原來的嘗試:

{% uploads_for_user leader as upload_count %} 
{{ upload_count }} upload{{ upload_count|pluralize }} 

更新:依照docs委派標籤,因爲Django的1.9被棄用(simple_tag現在可以存儲在一個模板變量的結果和應代替)

+2

這應該被標記爲新的最佳回答。 – imarban 2015-02-11 21:01:08

+1

自1.9開始棄用分配標記 - 編輯答案 – Anupam 2017-10-11 07:46:39

5

在Django 1.9中django.template.Library.assignment_tag()被刪除: simple_tag現在可以將結果存儲在模板變量中,而應該用於替代。

所以,現在simple tag我們可以用像:

這是可能的,而 存儲標記導致模板變量不是直接將其輸出。這是通過使用參數 後跟變量名來完成的。這樣做使您能夠輸出 內容你自己,你認爲合適的:

{% get_current_time "%Y-%m-%d %I:%M %p" as the_time %} 
<p>The time is {{ the_time }}.</p>