如何连接django模板中的string?
我想在django模板标签中连接string
{% extend shop/shop_name/base.html %}
这里shop_name是我的variables,我想连接这个path的其余部分。
假设我有shop_name=example.com
我想要扩展shop/example.com/base.html
用于:
{% with "shop/"|add:shop_name|add:"/base.html" as template %} {% include template %} {% endwith %}
不要使用add
string,你应该定义一个自定义标签,如下所示:
创build一个文件: <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说
{% with "shop/"|addstr:shop_name|addstr:"/base.html" as template %} {% include template %} {% endwith %}
避免add
原因
根据文件
这个filter将首先尝试强制两个值整数…可以被强制为整数的string将被求和, 而不是连接 …
如果两个variables碰巧是整数,结果将是意想不到的。
我已经改变了文件夹层次结构
/shop/shop_name/base.html 到 /shop_name/shop/base.html
然后下面会工作。
{% extends shop_name|add:"/shop/base.html"%}
现在它能够扩展base.html页面。
看看add
filter 。
编辑:你可以链filter,所以你可以做“shop /”| add:shop_name | add:“/ base.html”。 但是,这将无法正常工作,因为它取决于模板标记来评估参数中的filter,而扩展则不是。
我猜你不能在模板中做到这一点。
从文档:
这个标签可以用两种方式使用:
-
{% extends "base.html" %}
(带引号)使用字面值“base.html”作为扩展的父模板的名称。 -
{% extends variable %}
使用variables的值。 如果variables的计算结果为string,Django将使用该string作为父模板的名称。 如果variables的计算结果是一个Template对象,Django将使用该对象作为父模板。
所以好像你不能使用filter来操纵参数。 在调用视图中,您必须实例化祖先模板或使用正确的path创buildstringvariables,并将其与上下文一起传递。
@错误的答案是从根本上是正确的,你应该使用这个模板标签。 不过,我更喜欢一个稍微更通用的模板标签,我可以使用它来执行任何类似的操作:
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 %}
标记很麻烦。 相反,我创build了下面的模板标签,它应该在string和整数上工作。
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模板中进行variables操作。 你有两个select,要么写自己的模板标签,要么在视图中,
extends
没有这个设施。 将整个模板path放在上下文variables中,然后使用该模板path,或复制存在的模板标签并进行相应的修改。