Как объединить строки в шаблонах django?
Я хочу объединить строку в теге шаблона django, например
{% extend shop/shop_name/base.html %}
здесь shop_name-это моя переменная, и я хочу связать это с остальной частью пути.
Предположим, что я shop_name=example.com
и я хочу результат, чтобы продлить shop/example.com/base.html
10 ответов:
использовать с:
{% with "shop/"|add:shop_name|add:"/base.html" as template %} {% include template %} {% endwith %}
не используйте
addдля строк, вы должны определить пользовательский тег, как это :создайте файл :
<appname>\templatetags\<appname>_extras.pyfrom django import template register = template.Library() @register.filter def addstr(arg1, arg2): """concatenate arg1 & arg2""" return str(arg1) + str(arg2)и затем использовать его как @Стивен говорит
{% with "shop/"|addstr:shop_name|addstr:"/base.html" as template %} {% include template %} {% endwith %}
причиной
addпо словам docs
фильтр первый попробуйте принудить оба значения к целым числам... Строки, которые можно привести к целым числам, будут суммированы, не сцепляются...
если обе переменные являются целыми числами, результат будет неожиданным.
Я изменил иерархию папок
/ shop / shop_name / base.HTML-код до / shop_name / shop / base.HTML-код
и тогда ниже будет работать.
{% extends shop_name|add:"/shop/base.html"%}теперь его можно расширить базу.HTML-страница.
документы:
этот тег можно использовать двумя способами:
{% extends "base.html" %}(с кавычками) использует литеральное значение "base.html", как имя родительского шаблона для продления.{% extends variable %}использует значение переменной. Если переменная принимает значение строки, Django будет использовать эту строку в качестве имени родительского шаблона. Если переменная является объектом шаблона, Django будет использовать этот объект в качестве родительского шаблона.Так кажется например, вы не можете использовать фильтр для манипулирования аргументом. В вызывающем представлении необходимо либо создать экземпляр шаблона предка, либо создать строковую переменную с правильным путем и передать ее с контекстом.
посмотреть
addфильтр.редактировать: вы можете цепные фильтры, так что вы могли бы сделать
"shop/"|add:shop_name|add:"/base.html". Но это не сработает, потому что это зависит от тега шаблона для оценки фильтров в аргументах, а extends-нет.Я думаю, вы не можете сделать это в шаблонах.
ответ@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:
для более ранних версий Django:
{{"У Мэри было немного" / stringformat: "s lamb."}}
"У Мэри был барашек."
другое:
{{"У Мэри было немного" / добавить: "ягненок."}}
"У Мэри был маленький ягненок."
вы не можете делать переменные манипуляции в шаблонах django. У вас есть два варианта: либо написать свой собственный тег шаблона, либо сделать это с учетом,
extendsне имеет возможности для этого. Либо поместите весь путь шаблона в контекстную переменную и используйте ее, либо скопируйте тег exist template и измените его соответствующим образом.
Comments