variable template linebreaksbr length ifequal examples django django-templates

linebreaksbr - length django template



¿Cómo establecer un valor de una variable dentro de un código de plantilla? (9)

Crea una etiqueta de plantilla:

La aplicación debe contener un directorio templatetags , al mismo nivel que models.py , views.py , etc. Si aún no existe, views.py , no olvide el archivo __init__.py para asegurarse de que el directorio se trata como un paquete Python.

Cree un archivo denominado define_action.py dentro del directorio templatetags con el siguiente código:

from django import template register = template.Library() @register.assignment_tag def define(val=None): return val

Nota: El servidor de desarrollo no se reiniciará automáticamente. Después de agregar el módulo templatetags , deberá reiniciar su servidor para poder usar las etiquetas o filtros en las plantillas.

Luego, en su plantilla puede asignar valores al contexto de esta manera:

{% load define_action %} {% if item %} {% define "Edit" as action %} {% else %} {% define "Create" as action %} {% endif %} Would you like to {{action}} this item?

Digamos que tengo una plantilla

<html> <div>Hello {{name}}!</div> </html>

Mientras lo prueba, sería útil definir el valor de la variable sin tocar el código python que invoca esta plantilla. Así que estoy buscando algo como esto

{% set name="World" %} <html> <div>Hello {{name}}!</div> </html>

¿Algo como esto existe en Django?


Esta no es una buena idea en general. Haz toda la lógica en python y pasa los datos a la plantilla para mostrarlos. La plantilla debe ser lo más simple posible para garantizar que quienes trabajen en el diseño puedan enfocarse en el diseño en lugar de preocuparse por la lógica.

Para dar un ejemplo, si necesita información derivada dentro de una plantilla, es mejor incluirla en una variable en el código python y luego pasarla a la plantilla.


Hay trucos como el descrito por John; sin embargo, el lenguaje de plantilla de Django no es compatible con la configuración de una variable (consulte el cuadro "Filosofía" en la documentación de Django para ver las plantillas ).
Debido a esto, la forma recomendada de cambiar cualquier variable es tocando el código de Python.


La mejor solución para esto es escribir una etiqueta de assignment_tag personalizada. Esta solución es más limpia que usar una etiqueta with porque logra una separación muy clara entre la lógica y el estilo.

Comience por crear un archivo de etiqueta de plantilla (por ejemplo, appname/templatetags/hello_world.py ):

from django import template register = template.Library() @register.assignment_tag def get_addressee(): return "World"

Ahora puede usar la etiqueta de la plantilla get_addressee en sus plantillas:

{% load hello_world %} {% get_addressee as addressee %} <html> <body> <h1>hello {{addressee}}</h1> </body> </html>


Probablemente quieras la etiqueta with plantilla.

{% with "World" as name %} <html> <div>Hello {{name}}!</div> </html> {% endwith %}

EDITAR :

La forma correcta de usar la etiqueta con es ahora: (el formato anterior aún es compatible)

{% with name="World" greeting="Hello" %} <html> <div>{{ greeting }} {{name}}!</div> </html> {% endwith %}



Una forma alternativa que no requiere que ponga todo en el bloque "con" es crear una etiqueta personalizada que agregue una nueva variable al contexto. Como en:

class SetVarNode(template.Node): def __init__(self, new_val, var_name): self.new_val = new_val self.var_name = var_name def render(self, context): context[self.var_name] = self.new_val return '''' import re @register.tag def setvar(parser,token): # This version uses a regular expression to parse tag contents. try: # Splitting by None == splitting by spaces. tag_name, arg = token.contents.split(None, 1) except ValueError: raise template.TemplateSyntaxError, "%r tag requires arguments" % token.contents.split()[0] m = re.search(r''(.*?) as (/w+)'', arg) if not m: raise template.TemplateSyntaxError, "%r tag had invalid arguments" % tag_name new_val, var_name = m.groups() if not (new_val[0] == new_val[-1] and new_val[0] in (''"'', "''")): raise template.TemplateSyntaxError, "%r tag''s argument should be in quotes" % tag_name return SetVarNode(new_val[1:-1], var_name)

Esto le permitirá escribir algo como esto en su plantilla:

{% setvar "a string" as new_template_var %}

Tenga en cuenta que la mayor parte de esto fue tomada desde aquí


Use la declaración con .

{% with total=business.employees.count %} {{ total }} employee{{ total|pluralize }} {% endwith %}

No puedo implicar el código en el primer párrafo en esta respuesta . Tal vez el lenguaje de la plantilla había dejado de usar el formato anterior.


En tu plantilla puedes hacer esto:

{% jump_link as name %} {% for obj in name %} <div>{{obj.helo}} - {{obj.how}}</div> {% endfor %}

En sus etiquetas de plantilla, puede agregar una etiqueta como esta:

@register.assignment_tag def jump_link(): listArr = [] for i in range(5): listArr.append({"helo" : i,"how" : i}) return listArr