我是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' %}
- request_count|stringformat:'s'-将数字转换为字符串
- 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 %}
这解决了我的问题。