2010-01-22 20 views
7

Dentro de una plantilla de Django que 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:función de Python en la plantilla de Django

{{ 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?

+0

posible duplicado de [Función de llamada de plantilla Django] (http://stackoverflow.com/questions/2468804/django-template-call-function) – Marcin

Respuesta

6

¿Qué quiere decir con "no le gusta la división"? ¿Cómo manifiesta su aversión?

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

Hay por lo menos cuatro maneras de lograr lo que quiere:

  • que los datos sean preparadas adecuadamente disponible como un atributo de su modelo (o lo que sea), por el pre-procesamiento que
  • maquillaje los datos disponibles como un método para su modelo y asegúrese de que el método no tiene argumentos necesarios, además de self
  • poblar las instancias de modelo en la vista

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

    (o algo a lo largo de estas líneas)

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

Desde el django book:

Tenga en cuenta que no se incluye entre 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, debe hacerlo en la vista.

4

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.

Así que una forma posible de hacerlo es definir una función NewsletterPathLastElement (self) en su modelo de boletín de noticias, y llamarla desde la plantilla.

0

Sí, como otros han dicho, no debe realmente estarlo haciendo en las plantillas.

Pero si quieres, entonces necesitas definir un filtro y cargarlo en la plantilla y usarlo.

Cuestiones relacionadas