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



我是Django和Django模板的新手,我知道Django template与Rails相比有点限制。

所以我在电子邮件中包含了一个模板,比如:

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

但这会引发错误:TemplateSyntaxError: Could not parse the remainder: ''{request_count} requests'' from 'f'{request_count} requests''

有没有一种方法可以将这样的格式化字符串传递给include标记?

由于不能在Django模板中使用f-string,所以引发了异常-模板语言实际上不是Python。根据文档,使用include:时不需要显式传递上下文变量

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

如果你需要传递一个组合值(上下文加上其他类似"请求"字符串的东西(,你可以使用简单的标签:

标签.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 %}
{% include "./partials/_info_row.html" with value=request_count|stringformat:'s'|add:' requests' %}
  1. request_count|stringformat:'s'-将数字转换为字符串
  2. some_var|add:'requests'-连接字符串

感谢@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 %}

这解决了我的问题。

最新更新