Llamando a la función Python en la plantilla de Django

Dentro de una plantilla de django, estoy tratando de 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 necesito hacerlo para todos los registros. Sería mucho más fácil si pudiera hacerlo en la plantilla. ¿Hay alguna forma de hacer esto?

¿Qué quiere decir con “no le gusta la división”? ¿Cómo manifiesta su desagrado?

Si recuerdo correctamente, no puede pasar ningún argumento arbitrario a los métodos, que se llaman desde la plantilla de django y los identificadores, que se pueden usar en las plantillas, solo pueden consistir en az, AZ, 0-9, guiones bajos y puntos (donde los puntos significan búsqueda: diccionario-> atributo-> método-> lista-índice).

Hay al menos cuatro formas de lograr lo que quieres:

  • haga que los datos preparados apropiadamente estén disponibles como un atributo de su modelo (o lo que sea 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 requiere argumentos, además de la self
  • llenar las instancias del modelo en la vista

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

    (o algo por el estilo)

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

Del libro django :

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

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

Las plantillas no pueden hacer esas cosas deliberadamente. El propósito es evitar que ponga su lógica empresarial en plantillas, que están destinadas a tratar solo con el diseño.

Por lo tanto, una forma posible de hacer esto es definir una función de NewsletterPathLastElement (auto) en su Modelo de boletín de noticias, y llamar a eso desde la plantilla.

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

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