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

AP2*_*257 20 django

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

def uploads_for_user(user):
    uploads = Uploads.objects.filter(uploaded_by=user, problem_upload=False)
    num_uploads = uploads.count()
    return num_uploads
Run Code Online (Sandbox Code Playgroud)

我想做这样的事情,所以我可以正确地复数:

{% with uploads_for_user leader as upload_count %}
    {{ upload_count }} upload{{ upload_count|pluralize }}
{% endwith %}
Run Code Online (Sandbox Code Playgroud)

但是,uploads_for_user leader在此上下文中不起作用,因为'with'标记需要单个值 - Django返回:

TemplateSyntaxError at /upload/
u'with' expected format is 'value as name'
Run Code Online (Sandbox Code Playgroud)

知道如何绕过这个吗?

Dan*_*man 23

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

{% with user|uploads_for as upload_count %}
Run Code Online (Sandbox Code Playgroud)

  • Django 1.5+让你更简洁地做到这一点.{%with upload_count = user | uploads_for%} [django with](https://docs.djangoproject.com/en/1.5/ref/templates/builtins/#with) (3认同)

imi*_*ric 10

虽然过滤器仍然有效,但这个问题的当前答案是使用Django 1.4中引入的赋值标记.

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

{% uploads_for_user leader as upload_count %}
{{ upload_count }} upload{{ upload_count|pluralize }}
Run Code Online (Sandbox Code Playgroud)

更新:根据文档分配标签自Django 1.9以来已被弃用(simple_tag现在可以将结果存储在模板变量中,应该使用它)

  • 这应该被标记为新的最佳答案. (2认同)
  • 自 1.9 起已弃用分配标签 - 编辑了答案 (2认同)

Len*_*Lip 7

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

所以,现在简单的标签,我们可以使用如下:

可以将标记结果存储在模板变量中,而不是直接输出它.这是通过使用as参数后跟变量名来完成的.这样做可以让您在自己认为合适的地方输出内容:

{% get_current_time "%Y-%m-%d %I:%M %p" as the_time %}
<p>The time is {{ the_time }}.</p>
Run Code Online (Sandbox Code Playgroud)