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



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



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


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

Предположим, что я shop_name=example.com



и я хочу результат, чтобы продлить shop/example.com/base.html

918   10  

10 ответов:

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

{% with "shop/"|add:shop_name|add:"/base.html" as template %}
{% include template %}
{% endwith %}

не используйте 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)

и затем использовать его как @Стивен говорит

{% 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:

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

    {{"У Мэри было немного" / stringformat: "s lamb."}}

"У Мэри был барашек."

  1. другое:

    {{"У Мэри было немного" / добавить: "ягненок."}}

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

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

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

Comments

    Ничего не найдено.