Cómo concatenar cadenas en plantillas django?

Quiero concatenar cadena en la etiqueta de la plantilla django como

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

Aquí shop_name es mi variable y quiero concatenar esto con el rest de la ruta.
Supongamos que tengo shop_name=example.com

Y quiero que el resultado extienda shop/example.com/base.html

Usar con:

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

No use add para cadenas, debe definir una etiqueta personalizada como esta:

Crea un archivo: \templatetags\_extras.py

 from django import template register = template.Library() @register.filter def addstr(arg1, arg2): """concatenate arg1 & arg2""" return str(arg1) + str(arg2) 

y luego usarlo como @Steven dice

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

Motivo para evitar add

De acuerdo con los documentos

Este filtro primero intentará forzar ambos valores a enteros … Las cadenas que se pueden forzar a enteros se sumrán, no concatenarán

Si ambas variables son enteros, el resultado sería inesperado.

He cambiado la jerarquía de carpetas

/shop/shop_name/base.html To /shop_name/shop/base.html

y luego a continuación funcionaría.

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

Ahora puede ampliar la página base.html.

De los documentos:

Esta etiqueta se puede usar de dos maneras:

  • {% extends "base.html" %} (con comillas) usa el valor literal “base.html” como el nombre de la plantilla primaria para extender.
  • {% extends variable %} usa el valor de la 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 la plantilla padre.

Parece que no puede usar un filtro para manipular el argumento. En la vista de llamadas, debe crear una instancia de la plantilla antecesora o crear una variable de cadena con la ruta correcta y pasarla con el contexto.

Eche un vistazo al filtro de add .

Editar: Puede encadenar filtros, por lo que podría hacer “comprar /” | agregar: shop_name | add: “/ base.html”. Pero eso no funcionará porque depende de la etiqueta de la plantilla evaluar los filtros en argumentos, y no lo hace.

Supongo que no puedes hacer esto dentro de las plantillas.

La respuesta de @ error es fundamentalmente correcta, debería usar una etiqueta de plantilla para esto. Sin embargo, prefiero una etiqueta de plantilla ligeramente más genérica que pueda usar para realizar cualquier tipo de operación similar a esta:

 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 '' 

y luego puedes usarlo así en tu plantilla:

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

Como se menciona en el comentario, esta etiqueta de plantilla es particularmente útil para la información que se puede repetir en una plantilla, pero requiere lógica y otras cosas que conectarán sus plantillas, o en los casos en que desee reutilizar datos pasados ​​entre plantillas a través de bloques:

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

y entonces:

 {{ meta_title }}    

El crédito para la etiqueta captureas se debe enviar aquí: https://www.djangosnippets.org/snippets/545/

Encontré que trabajar con la etiqueta {% with %} es bastante complicado. En su lugar, creé la siguiente etiqueta de plantilla, que debería funcionar en cadenas y enteros.

 from django import template register = template.Library() @register.filter def concat_string(value_1, value_2): return str(value_1) + str(value_2) 

A continuación, cargue la etiqueta de plantilla en su plantilla en la parte superior usando lo siguiente:

 {% load concat_string %} 

Puede usarlo de la siguiente manera:

 123 

Personalmente, me pareció mucho más limpio trabajar con esto.

Consulte Concatenación de cadenas en plantillas de Django :

  1. Para versiones anteriores de Django:

    {{“Mary tenía un poco” | stringformat: “cordero”. }}

“María tenía un corderito.”

  1. Más:

    {{“María tuvo un poco” | agregar: “cordero”. }}

“María tenía un corderito.”

No se puede hacer la manipulación de variables en plantillas django. Tiene dos opciones, ya sea escribir su propia etiqueta de plantilla o hacer esto a la vista,

extends no tiene ninguna facilidad para esto. Ponga toda la ruta de la plantilla en una variable de contexto y utilícela, o copie la etiqueta de la plantilla existente y modifíquela adecuadamente.