[django] 장고 템플릿에서 문자열을 연결하는 방법은 무엇입니까?

Django 템플릿 태그에 문자열을 연결하고 싶습니다.

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

여기 shop_name내 변수가 있으며 나머지 경로와 이것을 연결하고 싶습니다.

내가 가지고 shop_name=example.com있고 결과를 확장하고 싶다고 가정 해보십시오 shop/example.com/base.html.



답변

함께 사용 :

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

@Steven이 말한대로 사용하십시오.

{% load <appname>_extras %}

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

피해야 할 이유 add:

문서 에 따르면

이 필터는 먼저 두 값을 모두 정수로 강제하려고 시도합니다 … 정수로 강제 할 수있는 문자열은 합산 되지 않고 합산됩니다 …

두 변수가 모두 정수이면 결과가 예상치 못한 것입니다.


답변

폴더 계층 구조를 변경했습니다

/shop/shop_name/base.html받는 사람 /shop_name/shop/base.html

아래에서 작동합니다.

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

이제 base.html 페이지를 확장 할 수 있습니다.


답변

Django 템플릿에서 문자열 연결을 참조하십시오 .

  1. Django의 이전 버전의 경우 :

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

“메리에게는 작은 양이있었습니다.”

  1. 그밖에:

    {{ "Mary had a little"|add:" lamb." }}

“메리에게는 작은 양이있었습니다.”


답변

add필터를 살펴보십시오 .

편집 : 필터를 연결할 수 있으므로 할 수 있습니다 "shop/"|add:shop_name|add:"/base.html". 그러나 인수의 필터를 평가하는 것은 템플릿 태그에 달려 있기 때문에 작동하지 않으며 확장은 작동하지 않습니다.

템플릿 내에서는이 작업을 수행 할 수 없습니다.


답변

문서에서 :

이 태그는 두 가지 방법으로 사용할 수 있습니다.

  • {% extends "base.html" %} (따옴표 포함)는 확장 할 상위 템플릿의 이름으로 리터럴 값 “base.html”을 사용합니다.
  • {% extends variable %}변수의 값을 사용합니다. 변수가 문자열로 평가되면 Django는 해당 문자열을 부모 템플릿의 이름으로 사용합니다. 변수가 Template 객체로 평가되면 Django는 해당 객체를 상위 템플릿으로 사용합니다.

따라서 인수를 조작하기 위해 필터를 사용할 수없는 것 같습니다. 호출 뷰에서 상위 템플리트를 인스턴스화하거나 올바른 경로로 문자열 변수를 작성하고 컨텍스트와 함께 전달해야합니다.


답변

@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/에 있습니다.