Come concatenare le stringhe nei template di Django?

Voglio concatenare una stringa nel tag modello django come

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

Qui shop_name è la mia variabile e voglio concatenarlo con il resto del percorso.
Supponiamo che abbia shop_name=example.com

E voglio che il risultato estenda shop/example.com/base.html

Usa con:

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

Non usare add per stringhe, dovresti definire un tag personalizzato come questo:

Creare un file: \templatetags\_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 usarlo come dice @Steven

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

Motivo per evitare di add

Secondo i documenti

Questo filtro cercherà innanzitutto di forzare entrambi i valori in numeri interi … Le stringhe che possono essere forzate agli interi saranno sumte, non concatenate

Se entrambe le variabili sono numeri interi, il risultato sarebbe inaspettato.

Ho cambiato la gerarchia delle cartelle

/shop/shop_name/base.html a /shop_name/shop/base.html

e poi sotto funzionerebbe.

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

Ora è in grado di estendere la pagina base.html.

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 della variabile. Se la variabile valuta una stringa, Django utilizzerà tale stringa come nome del modello principale. Se la variabile valuta un object Template, Django utilizzerà tale object come modello principale.

Quindi sembra che tu non possa usare un filtro per manipolare l’argomento. Nella vista di chiamata è necessario creare un’istanza del modello di antenato o creare una variabile di stringa con il percorso corretto e passarla con il contesto.

Dai un’occhiata al filtro add .

Modifica: puoi concatenare i filtri, in modo da poter fare “shop /” | add: shop_name | aggiungi: “/ base.html”. Ma questo non funzionerà perché dipende dal tag del template per valutare i filtri negli argomenti, e extends no.

Immagino che non puoi farlo nei modelli.

@ La risposta dell’errore è fondamentalmente corretta, dovresti usare un tag modello per questo. Tuttavia, preferisco un tag modello leggermente più generico che possa essere utilizzato 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 in questo modo nel tuo modello:

 {% captureas template %}shop/{{ shop_name }}/base.html{% endcaptureas %} {% include template %} 

Come menzionato nel commento, questo tag modello è particolarmente utile per informazioni ripetibili in tutto il modello, ma richiede logica e altre cose che possono provocare il blocco dei modelli o nei casi in cui si desidera riutilizzare i dati passati tra i modelli attraverso i blocchi:

 {% captureas meta_title %}{% spaceless %}{% block meta_title %} {% if self.title %}{{ self.title }}{% endif %} {% endblock %}{% endspaceless %} - DEFAULT WEBSITE NAME {% endcaptureas %} 

e poi:

 {{ meta_title }}    

Il credito per il tag captureas è dovuto qui: https://www.djangosnippets.org/snippets/545/

Ho trovato che lavorare con il tag {% with %} era un bel problema. Invece ho creato il seguente tag template, che dovrebbe funzionare su stringhe e 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 carica il tag del modello nel modello in alto usando quanto segue:

 {% load concat_string %} 

Puoi quindi usarlo nel seguente modo:

 123 

Personalmente ho trovato questo molto più pulito con cui lavorare.

Fare riferimento a Concatenazione di stringhe nei modelli di Django :

  1. Per le versioni precedenti di Django:

    {{“Mary ha avuto un piccolo” | stringformat: “s agnello.” }}

“Mary ha un piccolo agnello.”

  1. Altro:

    {{“Maria ha avuto un piccolo” | aggiungi: “agnello”. }}

“Mary ha un piccolo agnello.”

Non puoi fare manipolazioni variabili nei template di Django. Hai due opzioni, scrivi il tuo tag modello o fai questo 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.