2010-03-18 5 views
37

Je passe au template de Django une fonction qui retourne des enregistrements. Je veux appeler cette fonction et parcourir son résultat.Comment appeler la fonction qui prend un argument dans un template Django?

{% for item in my_func(10) %} 

Cela ne fonctionne pas. J'ai essayé de définir la valeur de retour de la fonction sur une variable et de l'itérer sur la variable, mais il ne semble pas possible de définir une variable dans un modèle Django.

Y at-il un moyen normal de le faire?

Répondre

47

Vous ne pouvez pas appeler une fonction nécessitant des arguments dans un modèle. Write une balise de gabarit ou un filtre à la place.

+57

Très triste. J'aimerais avoir un moyen plus simple. – cleg

+1

Je pense que la solution avec le python intégré '@ property' est la meilleure solution, bien sûr, selon la situation. – jrast

+0

oui, mais cela ne résout pas le problème. Django appelle automatiquement les fonctions si elles ne nécessitent aucun argument.Écrire '{% pour item dans myfunc%}' est équivalent à 'pour item dans myfunc()' si myfunc est une fonction sans arguments. La seule véritable restriction avec django est l'appel d'une fonction qui nécessite des arguments, que '@ property' ne résout pas (bien que vous puissiez définir certains attributs dans le template et les utiliser comme arguments, mais ce n'est pas particulièrement net) – matts1

8

Je passe au modèle de Django une fonction qui me retourne quelques enregistrements

Pourquoi ne pas vous passez à Django modèle que la valeur de retour de la fonction de stockage variable au lieu de la fonction?


J'ai essayé de définir la valeur de retour de auj à une variable et itérer variables, mais il semble y avoir aucun moyen de définir la variable dans le modèle Django.

Vous devez définir des variables dans les vues Django au lieu de modèles, puis les transmettre au modèle.

+0

Cette fonction renvoie des enregistrements et le paramètre est leur nombre. J'aimerais contrôler cette valeur à partir du modèle. – cleg

+2

Que faire si vous voulez que la fonction soit évaluée paresseusement? par exemple. vous voulez que le résultat soit disponible si nécessaire, mais vous ne voulez pas le calculer pour rien? Je suppose que je suis coincé écrire des balises de gabarit .. – Rob

2

De par leur conception, les modèles Django ne peuvent pas appeler du code Python arbitraire. Il s'agit d'une fonctionnalité de sécurité et de sécurité pour les environnements dans lesquels les concepteurs écrivent des modèles, ainsi que de la migration de la logique métier vers les modèles.

Si vous voulez faire cela, vous pouvez passer à l'utilisation de modèles Jinja2 (http://jinja.pocoo.org/docs/), ou de tout autre système de modèle que vous aimez qui supporte cela. Aucune autre partie de django ne sera affectée par les modèles que vous utilisez, car il s'agit intentionnellement d'un processus à sens unique. Vous pouvez même utiliser plusieurs systèmes de gabarits différents dans le même projet si vous le souhaitez.

15

Si vous avez un objet, vous pouvez le définir comme @property afin de pouvoir obtenir des résultats sans appel, par ex.

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

puis dans le modèle:

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

Avez-vous une référence pour ce @sherpya? – bozdoz

+2

propriété intégrée python http://docs.python.org/2/library/functions.html#property – sherpya

+0

Pas la même chose. Les éléments du tableau peuvent être différentes classes d'éléments. – kentor

1

Ce que vous pouvez faire est, créer la « fonction » comme un autre fichier de modèle et ensuite inclure ce fichier en passant les paramètres à lui.

intérieur index.html

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

intérieur 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

Comment puis-je contrôler que {% include "song_player_list.html" avec songs = latest_songs%} 'ne s'exécute que lorsqu'un bouton est cliqué. J'ai essayé de le mettre dans une fonction mais 'Django template' l'exécute chaque fois que je charge la page. –

Questions connexes