Django模板:如何将格式化字符串传递给include标签

3

我是一名新手,刚接触Django和Django模板。相较于Rails,我知道Django模板的限制性较强。

因此,我想在邮件中包含一个模板:

{% include "./partials/_info_row.html" with value=f'{request_count} requests' %}

但是这会抛出错误:TemplateSyntaxError: 无法解析剩余部分:''{request_count} requests''(来自于 'f'{request_count} requests'') 有没有办法将像这样的格式化字符串传递给include标签?
3个回答

1
{% include "./partials/_info_row.html" with value=request_count|stringformat:'s'|add:' requests' %}
  1. request_count|stringformat:'s' - 将数字转换为字符串
  2. some_var|add:'requests' - 拼接字符串

“stringformat”解决方案似乎可行,但我能否根据“request_count”复数化字符串? - Rahul Sagore

1
异常被抛出是因为在Django模板中不能使用f-strings——模板语言实际上不是Python。 根据文档,在使用include时不需要显式传递上下文变量:

加载一个模板并使用当前上下文进行渲染。

如果需要传递一个组合值(上下文加上类似于“requests”的字符串),可以使用简单标签

tags.py

@register.simple_tag(takes_context=True)
def your_custom_tag(context, format_string):
    request_count = context['request_count']
    return f'{request_count} requests'

模板

{% with r_count=your_custom_tag %}
{% include "./partials/_info_row.html" with value=r_count %}

有没有办法在自定义模板标签中使用 pluralize?目前我必须编写 if else 来判断计数是否大于1,以添加 s - Rahul Sagore

0

感谢@Chamel和@crazyzuber。我使用了你们的答案的组合。创建了自定义过滤器。

我知道自定义标签。但是我想避免这种情况,因为这不是通用标签,它只会在一个地方使用,所以我想要一种解决方案,不必编写自定义标签。但是自定义标签的解决方案有效,因为它允许您以任何方式格式化字符串,这是使用现有内置功能无法实现的。

顺便说一句,我使用了@register.filter

@register.filter(is_safe=True)
def request_count_text(count):
    return f"{count} request{ 's' if count > 1 else '' }"

并将其用作:

{% include "./_info_row.html" with value=request_count|request_count_text %}

这解决了我的问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接