Как конкатенировать строки в шаблонах django?

Вопрос: Я хочу объединить строку в теге шаблона Django, например: {% extend shop/shop_name/base.html %} Здесь shop_name - моя переменная, и я хочу shop_name это с остальной частью пути. Предположим, у меня есть shop_name=example.com и я хочу, чтобы результат расширил shop/example.com/base.html. Лучший ответ: Использовать с: {% with "shop/"|add:shop_name|add:"/base.html" as template %} {% include template %} {%

Вопрос:

Я хочу объединить строку в теге шаблона Django, например:

{% extend shop/shop_name/base.html %}

Здесь shop_name – моя переменная, и я хочу shop_name это с остальной частью пути.

Предположим, у меня есть shop_name=example.com и я хочу, чтобы результат расширил shop/example.com/base.html.

Лучший ответ:

Использовать с:

{% with «shop/»|add:shop_name|add:»/base.html» as template %} {% include template %} {% endwith %} Ответ №1

Не используйте 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 говорит

{% with «shop/»|addstr:shop_name|addstr:»/base.html» as template %} {% include template %} {% endwith %}

Причина для избежания add

В соответствии с docs

Этот фильтр будет первым попытаться принудить оба значения к целым числам… Строки, которые могут быть принудительно привязаны к целым числам, будут суммированы, не конкатенированы

Если обе переменные оказываются целыми, результат будет неожиданным.

Ответ №2

Я изменил иерархию папок

/shop/shop_name/base.html Кому/shop_name/shop/base.html

а затем ниже будет работать.

{% extends shop_name|add:»/shop/base.html»%}

Теперь он может расширить страницу base.html.

Ответ №3

Посмотрите на фильтр add.

Редактировать: Вы можете связать фильтры, чтобы вы могли сделать «shop/»|add:shop_name|add:»/base.html». Но это не сработает, потому что это зависит от тега шаблона, чтобы оценить фильтры в аргументах, а расширение не работает.

Я думаю, вы не можете сделать это в шаблонах.

Ответ №4

Из документов:

Этот тег можно использовать двумя способами:

  • {% extends «base.html» %} (с кавычками) использует буквальное значение “base.html” в качестве расширения родительского шаблона.
  • {% extends variable %} использует значение переменной. Если переменная оценивается как строка, Django будет использовать эту строку в качестве имени родительского шаблона. Если переменная оценивается объектом Template, Django будет использовать этот объект в качестве родительского шаблона.

Похоже, вы не можете использовать фильтр для манипулирования аргументом. В вызывающем представлении вам нужно либо создать экземпляр шаблона предка, либо создать строковую переменную с правильным путем и передать ее с помощью контекста.

Ответ №5

См. Конкатенация строк в шаблонах Django:

  1. Для более ранних версий Django:

    {{ «Mary had a little»|stringformat:»s lamb.» }}

“У Мэри был маленький ягненок.”

  1. Else:

    {{ «Mary had a little»|add:» lamb.» }}

“У Мэри был маленький ягненок.”

Ответ №6

@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/

Ответ №7

Я обнаружил, что работа с тегом {% 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>

Я лично считаю, что для работы с ним нужно работать намного больше.

Ответ №8

Вы не можете выполнять манипуляции переменной в шаблонах django.
У вас есть два варианта: либо написать свой собственный тег шаблона, либо сделать это в поле зрения,

Ответ №9

extends не имеет возможности для этого. Либо поместите весь путь шаблона в переменную контекста, либо используйте его, либо скопируйте тег существующего шаблона и соответствующим образом измените его.

Оцените статью
Добавить комментарий