urls tutorial template examples python django django-templates

tutorial - Llamar a la función de Python en la plantilla de Django



django urls path (4)

Dentro de una plantilla de django intento llamar a la función de división en una de las variables de la plantilla y luego obtener el último elemento, así que hice algo como esto:

{{ newsletter.NewsletterPath.split(''/'').-1 }}

Desafortunadamente, no le gusta la división. Algunos podrían sugerir que haga la división en la vista, pero no estoy seguro de cómo hacerlo porque tengo que hacerlo para todos los registros. Sería mucho más fácil si pudiera hacerlo en la plantilla. ¿Hay alguna forma de hacer esto?


¿A qué te refieres con "no me gusta la división"? ¿Cómo manifiesta su aversión?

Si mal no recuerdo, no se pueden pasar argumentos arbitrarios a los métodos, que se invocan desde la plantilla django y los identificadores, que se pueden usar en las plantillas solo pueden consistir en az, AZ, 0-9, guiones bajos y puntos (donde puntos significa búsqueda: diccionario-> atributo-> método-> lista-índice).

Hay al menos cuatro formas de lograr lo que desea:

  • haga que los datos preparados apropiadamente estén disponibles como un atributo de su modelo (o lo que sea), preprocesándolo
  • haga que los datos estén disponibles como un método de su modelo y asegúrese de que el método no requiera argumentos, además de self
  • poblar las instancias modelo en la vista

    for newsletter in newsletters: setattr(newsletter, ''basepath'', newsletter.NewsletterPath.split(''/'')[-1])

    (o algo parecido a esto)

  • implementar una etiqueta de filtro personalizada, que manejará la división (más fácil, de lo que podría pensar)

Las plantillas deliberadamente no pueden hacer tales cosas. El objetivo es evitar que pongas tu lógica de negocio en plantillas, que están destinadas a tratar solo con el diseño.

Entonces, una forma posible de hacerlo es definir una función NewsletterPathLastElement (self) en su modelo de newsletter, y llamarla desde la plantilla.


Sí, como han dicho otros, realmente no deberías hacerlo en las plantillas.

Pero si lo desea, entonces necesita definir un filtro y cargarlo en la plantilla y usarlo.


Del libro django :

Tenga en cuenta que no incluye paréntesis en las llamadas a métodos. Además, no es posible pasar argumentos a los métodos; solo puede llamar a métodos que no tienen argumentos requeridos.

Por lo tanto, si desea llamar a un método sin argumentos desde una plantilla, está bien. De lo contrario, debes hacerlo en la vista.