Django - 使用模板标签和'带'?

时间:2010-04-23 10:19:48

标签: django

我有一个自定义模板标记:

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'

知道如何绕过这个吗?

3 个答案:

答案 0 :(得分:23)

你可以把它变成一个过滤器:

{% with user|uploads_for as upload_count %}

答案 1 :(得分:10)

虽然过滤器仍然可以使用,但这个问题的当前答案是使用Django 1.4中引入的assignment tags

因此解决方案与您原来的尝试非常相似:

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

更新:根据docs分配代码已弃用,因为Django 1.9(simple_tag现在可以将结果存储在模板变量中,应该替代使用)

答案 2 :(得分:6)

在Django 1.9中,django.template.Library.assignment_tag()被删除: simple_tag现在可以将结果存储在模板变量中,而应该使用它。

所以,现在simple tag我们可以使用如下:

  

可以将标记结果存储在模板变量中   而不是直接输出它。这是通过使用as参数完成的   后跟变量名称。这样做可以输出   满足自己的需要:

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