2010-04-23 135 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>