Comment appeler une fonction qui prend un argument dans un modèle Django?

Je passe au modèle de Django une fonction, qui renvoie des enregistrements. Je veux appeler cette fonction et itérer sur son résultat.

{% for item in my_func(10) %} 

, ce Qui ne fonctionne pas. J'ai essayé de définir la valeur de retour de la fonction à une variable et d'itérer sur la variable, mais il ne semble pas y avoir moyen de définir une variable dans un modèle Django.

Y a-t-il un moyen normal de le faire?

40

5 réponses

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

50
répondu Ignacio Vazquez-Abrams 2010-03-18 09:58:02

Si vous avez un objet, vous pouvez le Définir comme {[2] } afin d'obtenir des résultats sans appel, par exemple

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

, Puis dans le modèle:

<% for result in item.results %>
...
<% endfor %>
17
répondu sherpya 2014-02-03 15:11:23

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

Pourquoi ne passez-vous pas au modèle Django la valeur de retour de la variable stockant la fonction, au lieu de la fonction?


J'ai essayé de définir la valeur de retour de fuction sur une variable et d'itérer sur variable, mais il ne semble pas y avoir moyen de définir une variable dans le modèle Django.

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

9
répondu dolma33 2010-03-25 21:46:03

Par conception, les modèles Django ne peuvent pas appeler de code Python arbitraire. Il s'agit d'une fonctionnalité de sécurité pour les environnements où les concepteurs écrivent des modèles, et elle empêche également la migration de la logique métier vers des modèles.

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

3
répondu Marcin 2013-07-27 21:14:06

Ce que vous pouvez faire est de créer la "fonction" comme un autre fichier de modèle, puis d'inclure ce fichier en lui transmettant les paramètres.

À l'intérieur de l'index.html

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

Dans 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>
1
répondu sidmanu 2015-01-17 17:39:50