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 템플릿에서 문자열 연결을 참조하십시오 .
-
Django의 이전 버전의 경우 :
{{ "Mary had a little"|stringformat:"s lamb." }}
“메리에게는 작은 양이있었습니다.”
-
그밖에:
{{ "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/에 있습니다.