如何连接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 %} 

不要使用addstring,你应该定义一个自定义标签,如下所示:

创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页面。

看看addfilter 。

编辑:你可以链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,或复制存在的模板标签并进行相应的修改。