Quiero concatenar una cadena en una etiqueta de plantilla de Django, como:
{% extend shop/shop_name/base.html %}
Aquí shop_name
está mi variable y quiero concatenar esto con el resto del camino.
Supongamos que tengo shop_name=example.com
y quiero ampliar el resultado shop/example.com/base.html
.
django
django-templates
Ahsan
fuente
fuente
shop_name
en absoluto, por lo que es peligroso.shop_name
antes de pasarlo al contexto en una vista,get_context_data
asegúrese de que se traduzca usando enugettext
lugar deugettext_lazy
.No use
add
para cadenas, debe definir una etiqueta personalizada como esta:Crea un archivo:
<appname>\templatetags\<appname>_extras.py
y luego úsalo como dice @Steven
Motivo para evitar
add
:De acuerdo con los documentos
Si ambas variables son enteras, el resultado sería inesperado.
fuente
add
" solo simplemente no utilizarstr()
en primer lugar y no funcionaba en absoluto para mí mientras que su solución funciona a la perfección{% load <appname>_extras %}
He cambiado la jerarquía de carpetas.
y luego a continuación funcionaría.
Ahora es capaz de extender la página base.html.
fuente
Consulte Concatenación de cadenas en las plantillas de Django :
Para versiones anteriores de Django:
{{ "Mary had a little"|stringformat:"s lamb." }}
Más:
{{ "Mary had a little"|add:" lamb." }}
fuente
Echa un vistazo al
add
filtro .Editar: puede encadenar filtros, para que pueda hacerlo
"shop/"|add:shop_name|add:"/base.html"
. Pero eso no funcionará porque depende de la etiqueta de la plantilla evaluar los filtros en los argumentos, y las extensiones no lo hacen.Supongo que no puedes hacer esto dentro de las plantillas.
fuente
De los documentos:
Esta etiqueta se puede usar de dos maneras:
{% extends "base.html" %}
(con comillas) utiliza el valor literal "base.html" como el nombre de la plantilla principal para ampliar.{% extends variable %}
usa el valor de variable. Si la variable se evalúa como una cadena, Django usará esa cadena como el nombre de la plantilla principal. Si la variable se evalúa como un objeto Plantilla, Django usará ese objeto como plantilla principal.Parece que no puedes usar un filtro para manipular el argumento. En la vista de llamada, debe crear una instancia de la plantilla de antepasado o crear una variable de cadena con la ruta correcta y pasarla con el contexto.
fuente
La respuesta de @ error es fundamentalmente correcta, debe usar una etiqueta de plantilla para esto. Sin embargo, prefiero una etiqueta de plantilla un poco más genérica que pueda usar para realizar cualquier tipo de operaciones similares a esta:
y luego puedes usarlo así en tu plantilla:
Como se menciona en el comentario, esta etiqueta de plantilla es particularmente útil para la información que se puede repetir a través de una plantilla pero requiere lógica y otras cosas que agruparán sus plantillas, o en los casos en que desee reutilizar los datos pasados entre plantillas a través de bloques:
y entonces:
El crédito para la etiqueta captureas se debe aquí: https://www.djangosnippets.org/snippets/545/
fuente
Encontré que trabajar con la
{% with %}
etiqueta es bastante complicado. En su lugar, creé la siguiente etiqueta de plantilla, que debería funcionar en cadenas y enteros.Luego cargue la etiqueta de plantilla en su plantilla en la parte superior usando lo siguiente:
Luego puede usarlo de la siguiente manera:
Personalmente, encontré que esto es mucho más limpio para trabajar.
fuente
No puedes hacer manipulación de variables en las plantillas de django. Tiene dos opciones: escribir su propia etiqueta de plantilla o hacer esto a la vista,
fuente
extends
no tiene facilidades para esto. Coloque la ruta completa de la plantilla en una variable de contexto y úsela, o copie la etiqueta de plantilla existente y modifíquela adecuadamente.fuente
Y concatenación múltiple:
Y en plantilla:
fuente