Risposte:
Usa con:
{% with "shop/"|add:shop_name|add:"/base.html" as template %}
{% include template %}
{% endwith %}
shop_name
affatto, quindi è pericoloso.
shop_name
prima di passarlo al contesto in una vista get_context_data
assicurati che sia tradotto usando ugettext
invece di ugettext_lazy
.
Non utilizzare add
per le stringhe, è necessario definire un tag personalizzato come questo:
Crea un file: <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)
e poi usalo come dice @Steven
{% load <appname>_extras %}
{% with "shop/"|addstr:shop_name|addstr:"/base.html" as template %}
{% include template %}
{% endwith %}
Motivo per evitare add
:
Secondo i documenti
Questo filtro tenterà innanzitutto di forzare entrambi i valori in numeri interi ... Le stringhe che possono essere forzate in numeri interi verranno sommate, non concatenate ...
Se entrambe le variabili fossero numeri interi, il risultato sarebbe inatteso.
add
" da solo non usa str()
al primo posto e non ha funzionato affatto per me mentre la tua soluzione funziona perfettamente
{% load <appname>_extras %}
Fare riferimento a Concatenare le stringhe nei modelli Django :
Per le versioni precedenti di Django:
{{ "Mary had a little"|stringformat:"s lamb." }}
"Mary ha un piccolo agnello."
Altro:
{{ "Mary had a little"|add:" lamb." }}
"Mary ha un piccolo agnello."
Dai un'occhiata al add
filtro .
Modifica: puoi incatenare i filtri, così puoi farlo "shop/"|add:shop_name|add:"/base.html"
. Ma ciò non funzionerà perché spetta al tag template valutare i filtri negli argomenti e non lo estende.
Immagino che non puoi farlo all'interno dei modelli.
Dai documenti:
Questo tag può essere utilizzato in due modi:
{% extends "base.html" %}
(con virgolette) utilizza il valore letterale "base.html" come nome del modello principale da estendere.{% extends variable %}
utilizza il valore di variabile. Se la variabile restituisce una stringa, Django userà quella stringa come nome del modello genitore. Se la variabile restituisce un oggetto Template, Django userà quell'oggetto come template genitore.Quindi sembra che non puoi usare un filtro per manipolare l'argomento. Nella vista chiamante devi creare un'istanza del modello di antenato o creare una variabile stringa con il percorso corretto e passarla con il contesto.
La risposta di @ error è fondamentalmente corretta, per questo dovresti usare un tag template. Tuttavia, preferisco un tag modello leggermente più generico che posso utilizzare per eseguire qualsiasi tipo di operazione simile a questa:
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 ''
e quindi puoi usarlo così nel tuo modello:
{% captureas template %}shop/{{ shop_name }}/base.html{% endcaptureas %}
{% include template %}
Come menzionato nel commento, questo tag modello è particolarmente utile per le informazioni ripetibili in un modello ma richiede logica e altre cose che bloccano i modelli o nei casi in cui si desidera riutilizzare i dati passati tra i modelli attraverso blocchi:
{% captureas meta_title %}{% spaceless %}{% block meta_title %}
{% if self.title %}{{ self.title }}{% endif %}
{% endblock %}{% endspaceless %} - DEFAULT WEBSITE NAME
{% endcaptureas %}
e poi:
<title>{{ meta_title }}</title>
<meta property="og:title" content="{{ meta_title }}" />
<meta itemprop="name" content="{{ meta_title }}">
<meta name="twitter:title" content="{{ meta_title }}">
Il credito per il tag captureas è dovuto qui: https://www.djangosnippets.org/snippets/545/
Ho trovato lavorare con il {% with %}
tag per essere una seccatura. Invece ho creato il seguente tag template, che dovrebbe funzionare su stringhe e numeri interi.
from django import template
register = template.Library()
@register.filter
def concat_string(value_1, value_2):
return str(value_1) + str(value_2)
Quindi caricare il tag modello nel modello in alto utilizzando quanto segue:
{% load concat_string %}
È quindi possibile utilizzarlo nel modo seguente:
<a href="{{ SOME_DETAIL_URL|concat_string:object.pk }}" target="_blank">123</a>
Personalmente ho trovato questo per essere molto più pulito con cui lavorare.
Non è possibile eseguire manipolazioni variabili nei modelli di django. Sono disponibili due opzioni: scrivere il proprio tag modello o farlo in vista,
extends
non ha possibilità per questo. Inserire l'intero percorso del modello in una variabile di contesto e utilizzarlo oppure copiare il tag del modello esistente e modificarlo in modo appropriato.
E concatenazione multipla:
from django import template
register = template.Library()
@register.simple_tag
def concat_all(*args):
"""concatenate all args"""
return ''.join(map(str, args))
E nel modello:
{% concat_all 'x' 'y' another_var as string_result %}
concatenated string: {{ string_result }}