Yanıtlar:
La kullan:
{% with "shop/"|add:shop_name|add:"/base.html" as template %}
{% include template %}
{% endwith %}
shop_name
, bu yüzden tehlikeli.
shop_name
bir görünümde bağlamda geçirmeden önce en get_context_data
kullanarak tercüme emin olun ugettext
yerine ugettext_lazy
.
add
Dizeler için kullanmayın , şöyle özel bir etiket tanımlamanız gerekir:
Bir dosya oluşturun: <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)
ve sonra @Steven'in dediği gibi kullanın
{% load <appname>_extras %}
{% with "shop/"|addstr:shop_name|addstr:"/base.html" as template %}
{% include template %}
{% endwith %}
Kaçınma nedeni add
:
Dokümanlara göre
Bu filtre ilk önce her iki değeri de tamsayılara zorlamaya çalışacaktır ... Tamsayılara zorlanabilen dizeler toplanır, birleştirilmez ...
Her iki değişken de tamsayı olursa, sonuç beklenmedik olur.
add
" Yalnız sadece kullanmaz str()
ilk etapta ve iş vermedi hiç benim için çözüm sorunsuz çalışır oysa
{% load <appname>_extras %}
Bakınız Django şablonları içinde Dizeleri bitiştirme :
Django'nun önceki sürümleri için:
{{ "Mary had a little"|stringformat:"s lamb." }}
"Mary küçük bir kuzuya sahipti."
Başka:
{{ "Mary had a little"|add:" lamb." }}
"Mary küçük bir kuzuya sahipti."
add
Filtreye bir göz atın .
Düzenleme: Filtreleri zincirleyebilirsiniz, böylece yapabilirsiniz "shop/"|add:shop_name|add:"/base.html"
. Ancak bu çalışmaz, çünkü argümanlardaki filtreleri değerlendirmek şablon etiketine bağlıdır ve genişletmez.
Sanırım bunu şablonlar içinde yapamazsınız.
Dokümanlardan:
Bu etiket iki şekilde kullanılabilir:
{% extends "base.html" %}
(tırnak işaretleri ile) genişletilecek üst şablonun adı olarak "base.html" değişmez değerini kullanır.{% extends variable %}
değişkenin değerini kullanır. Değişken bir dize olarak değerlendirilirse, Django bu dizeyi üst şablonun adı olarak kullanır. Değişken Şablon nesnesini değerlendirirse, Django bu nesneyi üst şablon olarak kullanır.Yani argümanı manipüle etmek için bir filtre kullanamazsınız. Arama görünümünde ya ata şablonunu başlatmanız ya da doğru yolla bir dize değişkeni oluşturmanız ve bunu bağlamla birlikte iletmeniz gerekir.
@ hatanın cevabı temel olarak doğrudur, bunun için bir şablon etiketi kullanmalısınız. Ancak, buna benzer her türlü işlemi gerçekleştirmek için kullanabileceğim biraz daha genel bir şablon etiketini tercih ederim:
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 ''
ve bunu şablonunuzda şu şekilde kullanabilirsiniz:
{% captureas template %}shop/{{ shop_name }}/base.html{% endcaptureas %}
{% include template %}
Yorumda belirtildiği gibi, bu şablon etiketi bir şablon boyunca tekrarlanabilir ancak şablonlarınızı tıklatacak mantık ve diğer şeyleri gerektiren veya şablonlar arasında bloklar arasında aktarılan verileri yeniden kullanmak istediğiniz durumlarda özellikle yararlıdır:
{% captureas meta_title %}{% spaceless %}{% block meta_title %}
{% if self.title %}{{ self.title }}{% endif %}
{% endblock %}{% endspaceless %} - DEFAULT WEBSITE NAME
{% endcaptureas %}
ve sonra:
<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 etiketinin kredisi burada: https://www.djangosnippets.org/snippets/545/
{% with %}
Etiketi ile çalışmayı oldukça güçlükle buldum . Bunun yerine, dizeler ve tamsayılar üzerinde çalışması gereken aşağıdaki şablon etiketini oluşturdum.
from django import template
register = template.Library()
@register.filter
def concat_string(value_1, value_2):
return str(value_1) + str(value_2)
Ardından, aşağıdakileri kullanarak şablon etiketini en üstteki şablonunuza yükleyin:
{% load concat_string %}
Daha sonra aşağıdaki şekilde kullanabilirsiniz:
<a href="{{ SOME_DETAIL_URL|concat_string:object.pk }}" target="_blank">123</a>
Şahsen bununla çalışmak için çok daha temiz olduğunu gördüm.
Django şablonlarında değişken manipülasyon yapamazsınız. İki şablonunuz var, kendi şablon etiketinizi yazın veya bunu görünümde yapın,
extends
bunun için bir tesisi yok. Tüm şablon yolunu bir bağlam değişkenine yerleştirin ve bunu kullanın veya mevcut şablon etiketini kopyalayın ve uygun şekilde değiştirin.
Ve çoklu birleştirme:
from django import template
register = template.Library()
@register.simple_tag
def concat_all(*args):
"""concatenate all args"""
return ''.join(map(str, args))
Ve Şablonda:
{% concat_all 'x' 'y' another_var as string_result %}
concatenated string: {{ string_result }}