2010-03-18 12 views
37

Sto passando al modello di Django una funzione, che restituisce alcuni record. Voglio chiamare questa funzione e scorrere il suo risultato.Come chiamare la funzione che accetta un argomento in un modello Django?

{% for item in my_func(10) %} 

Che non funziona. Ho provato a impostare il valore di ritorno della funzione su una variabile e a scorrere sulla variabile, ma sembra che non ci sia modo di impostare una variabile in un modello Django.

C'è un modo normale per farlo?

risposta

47

Non è possibile chiamare una funzione che richiede argomenti in un modello. Write invece un tag o filtro modello.

+57

Molto triste. Mi piacerebbe avere un modo più semplice. – cleg

+1

Penso che la soluzione con il builtin python '@ property' sia la soluzione migliore, ovviamente, a seconda della situazione. – jrast

+0

sì, tuttavia ciò non risolve il problema. Django chiama automaticamente le funzioni se non richiedono argomenti.Scrivere '{% per l'elemento in myfunc%}' è equivalente a 'per l'elemento in myfunc()' se myfunc è una funzione senza argomenti. L'unica vera restrizione con django è chiamare una funzione che richiede argomenti, che '@ property' non risolve (anche se ammettiamolo potresti impostare alcuni attributi nel template e usarli come argomenti, ma non è particolarmente pulito) – matts1

8

sto passando al modello di Django una funzione, che mi riporta alcuni record

Perché non si passa a Django Modello di valore di ritorno della funzione di memorizzazione variabili, anziché la funzione?


Ho cercato di impostare il valore di ritorno di fuction a una variabile e iterare variabile, ma sembra che ci sia alcun modo per impostare la variabile nel modello di Django.

È necessario impostare le variabili nelle viste Django anziché nei modelli e quindi passarle al modello.

+0

Questa funzione restituisce alcuni record e il parametro è il loro conteggio. Mi piacerebbe controllare questo valore dal modello. – cleg

+2

E se si desidera che la funzione venga valutata pigramente? per esempio. vuoi che il risultato sia disponibile se necessario, ma non vuoi calcolarlo per niente? Immagino di essere bloccato a scrivere tag modello .. – Rob

2

In base alla progettazione, i modelli di Django non possono chiamare codice Python arbitrario. Si tratta di una funzionalità di sicurezza e protezione per ambienti in cui i progettisti scrivono modelli e impedisce inoltre la migrazione della logica di business nei modelli.

Se si desidera eseguire questa operazione, è possibile passare all'utilizzo dei modelli Jinja2 (http://jinja.pocoo.org/docs/) o qualsiasi altro sistema di template che si preferisce a tale scopo. Nessun'altra parte di django sarà influenzata dai modelli che usi, perché è intenzionalmente un processo a senso unico. Se lo volessi, potresti anche utilizzare molti diversi template template nello stesso progetto.

15

se si dispone di un oggetto è possibile definirlo come @property in modo da poter ottenere risultati senza una chiamata, ad es.

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

poi nel modello:

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

Hai un riferimento per questo @sherpya? – bozdoz

+2

proprietà built-in python http://docs.python.org/2/library/functions.html#property – sherpya

+0

Non lo stesso. Le cose nell'array possono essere diverse classi di oggetti. – kentor

1

Che cosa si potrebbe fare è, creare la "funzione" come un altro file di modello e quindi includere il file passando i parametri ad esso.

All'interno index.html

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

All'interno 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

Come posso controllare che '{% includi" song_player_list.html "con songs = latest_songs%}' esegui solo quando si fa clic su un pulsante. Ho provato a metterlo in una funzione, ma 'template Django 'lo esegue ogni volta che carico la pagina. –

Problemi correlati