Answers:
用于:
{% with "shop/"|add:shop_name|add:"/base.html" as template %}
{% include template %}
{% endwith %}
shop_name
,所以很危险。
shop_name
在将其传递到视图的上下文之前get_context_data
进行翻译,请确保使用ugettext
而不是对其进行翻译ugettext_lazy
。
不要add
用于字符串,您应该定义一个自定义标签,如下所示:
创建一个文件: <appname>\templatetags\<appname>_extras.py
from django import template
register = template.Library()
@register.filter
def addstr(arg1, arg2):
"""concatenate arg1 & arg2"""
return str(arg1) + str(arg2)
然后像@Steven所说的那样使用它
{% load <appname>_extras %}
{% with "shop/"|addstr:shop_name|addstr:"/base.html" as template %}
{% include template %}
{% endwith %}
避免的原因add
:
根据文档
此过滤器将首先尝试将两个值都强制转换为整数...可以强制转换为整数的字符串将被求和,而不是连接在一起 ...
如果两个变量碰巧都是整数,则结果将是意外的。
add
”一字str()
不用,对我根本没有用,而您的解决方案则完美无缺
{% load <appname>_extras %}
请参阅Django模板中的串联字符串:
对于早期版本的Django:
{{ "Mary had a little"|stringformat:"s lamb." }}
“玛丽有只小羊羔。”
其他:
{{ "Mary had a little"|add:" lamb." }}
“玛丽有只小羊羔。”
看看add
过滤器。
编辑:您可以链接筛选器,所以您可以 "shop/"|add:shop_name|add:"/base.html"
。但这是行不通的,因为它取决于模板标签来评估参数中的过滤器,而扩展则不能。
我想您无法在模板中执行此操作。
@error的答案从根本上是正确的,您应该为此使用模板标签。但是,我更喜欢通用的模板标签,可以用来执行类似以下的任何类型的操作:
from django import template
register = template.Library()
@register.tag(name='captureas')
def do_captureas(parser, token):
"""
Capture content for re-use throughout a template.
particularly handy for use within social meta fields
that are virtually identical.
"""
try:
tag_name, args = token.contents.split(None, 1)
except ValueError:
raise template.TemplateSyntaxError("'captureas' node requires a variable name.")
nodelist = parser.parse(('endcaptureas',))
parser.delete_first_token()
return CaptureasNode(nodelist, args)
class CaptureasNode(template.Node):
def __init__(self, nodelist, varname):
self.nodelist = nodelist
self.varname = varname
def render(self, context):
output = self.nodelist.render(context)
context[self.varname] = output
return ''
然后可以在模板中像这样使用它:
{% captureas template %}shop/{{ shop_name }}/base.html{% endcaptureas %}
{% include template %}
正如评论所提到的,此模板标记对于在整个模板中可重复的信息特别有用,但需要逻辑和其他东西来破坏您的模板,或者在您想要重新使用通过块在模板之间传递的数据的情况下:
{% captureas meta_title %}{% spaceless %}{% block meta_title %}
{% if self.title %}{{ self.title }}{% endif %}
{% endblock %}{% endspaceless %} - DEFAULT WEBSITE NAME
{% endcaptureas %}
然后:
<title>{{ meta_title }}</title>
<meta property="og:title" content="{{ meta_title }}" />
<meta itemprop="name" content="{{ meta_title }}">
<meta name="twitter:title" content="{{ meta_title }}">
可在此处获得captureas标签的信誉:https ://www.djangosnippets.org/snippets/545/
我发现使用该{% with %}
标签非常麻烦。相反,我创建了以下模板标记,该标记应适用于字符串和整数。
from django import template
register = template.Library()
@register.filter
def concat_string(value_1, value_2):
return str(value_1) + str(value_2)
然后使用以下命令将模板标签加载到顶部的模板中:
{% load concat_string %}
然后可以通过以下方式使用它:
<a href="{{ SOME_DETAIL_URL|concat_string:object.pk }}" target="_blank">123</a>
我个人发现这可以使工作更清洁。
您不能在Django模板中执行变量操作。您有两种选择,要么编写自己的模板标记,要么在视图中执行此操作,
extends
没有为此的设施。可以将整个模板路径放在上下文变量中并使用它,或者复制现有的模板标记并对其进行适当的修改。