2010-03-18 15 views
37

Paso a la plantilla de Django, una función que devuelve algunos registros. Quiero llamar a esta función e iterar sobre su resultado.¿Cómo llamar a la función que toma un argumento en una plantilla de Django?

{% for item in my_func(10) %} 

Eso no funciona. He intentado establecer el valor de retorno de la función a una variable e iterar sobre la variable, pero parece que no hay forma de establecer una variable en una plantilla de Django.

¿Hay alguna manera normal de hacerlo?

Respuesta

47

No puede llamar a una función que requiere argumentos en una plantilla. Write una etiqueta de plantilla o filtro en su lugar.

+57

muy triste. Me gustaría tener una manera más simple. – cleg

+1

Creo que la solución con el pitón incorporado '@ property' es la mejor solución, por supuesto, dependiendo de la situación. – jrast

+0

sí, sin embargo, eso no resuelve el problema. Django llama automáticamente a las funciones si no requieren argumentos.Escribir '{% para el elemento en myfunc%}' es equivalente a 'para el elemento en myfunc()' si myfunc es una función sin argumentos. La única restricción real con django es llamar a una función que requiere argumentos, que '@ property' no resuelve (aunque es cierto que se pueden establecer algunos atributos en la plantilla y usarlos como argumentos, pero eso tampoco está particularmente limpio) – matts1

8

estoy pasando a la plantilla de Django una función, lo que me devuelva algunos registros

¿Por qué no pase a Django Plantilla de valores de retorno de la función de almacenamiento variables, en lugar de la función?


He tratado de establecer el valor de retorno de fuction a una variable y iterar sobre variables, pero no parece haber ninguna manera de establecer la variable de plantillas de Django.

Debe establecer las variables en las vistas de Django en lugar de las plantillas y, a continuación, pasar a la plantilla.

+0

Esta función devuelve algunos registros, y el parámetro es su recuento. Me gustaría controlar este valor desde la plantilla. – cleg

+2

¿Qué sucede si desea que la función se evalúe de forma diferida? p.ej. ¿desea que el resultado esté disponible si es necesario, pero no desea calcularlo para nada? Supongo que estoy atascado escribiendo etiquetas de plantilla. – Rob

2

Por diseño, las plantillas de Django no pueden llamar al código arbitrario de Python. Esta es una característica de seguridad y protección para entornos donde los diseñadores escriben plantillas, y también evita que la lógica de negocios migre a plantillas.

Si desea hacer esto, puede cambiar al uso de plantillas Jinja2 (http://jinja.pocoo.org/docs/), o cualquier otro sistema de plantillas que le guste que lo admita. Ninguna otra parte de django se verá afectada por las plantillas que use, porque es intencionalmente un proceso unidireccional. Incluso podría usar muchos sistemas de plantillas diferentes en el mismo proyecto si quisiera.

15

si tiene un objeto, puede definirlo como @property para que pueda obtener resultados sin una llamada, p.

class Item: 
    @property 
    def results(self): 
     return something 

a continuación en la plantilla:

<% for result in item.results %> 
... 
<% endfor %> 
+0

¿Tiene una referencia para este @sherpya? – bozdoz

+2

propiedad incorporada de python http://docs.python.org/2/library/functions.html#property – sherpya

+0

No es lo mismo. Las cosas en la matriz pueden ser diferentes clases de elementos. – kentor

1

Lo que podría hacer es, crear la "función" como otro archivo de plantilla y luego incluir ese archivo pasando los parámetros a ella.

Dentro index.html

<h3> Latest Songs </h3> 
{% include "song_player_list.html" with songs=latest_songs %} 

Dentro song_player_list.html

<ul> 
{% for song in songs %} 
<li> 
<div id='songtile'> 
<a href='/songs/download/{{song.id}}/'><i class='fa fa-cloud-download'></i>&nbsp;Download</a> 

</div> 
</li> 
{% endfor %} 
</ul> 
+0

¿Cómo puedo controlar que '{% include" song_player_list.html "con songs = latest_songs%}' se ejecute solo cuando se hace clic en un botón. Traté de ponerlo en una función pero 'plantilla Django' ejecutarlo cada vez que cargué la página. –

Cuestiones relacionadas