web-dev-qa-db-fra.com

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

Je passe au modèle de Django une fonction, qui retourne quelques enregistrements. Je veux appeler cette fonction et répéter son résultat.

{% for item in my_func(10) %} 

Ça ne marche pas. J'ai essayé de définir la valeur de retour de la fonction sur une variable et d'itérer sur la variable, mais il semble qu'il n'y ait aucun moyen de définir une variable dans un modèle Django.

Existe-t-il un moyen normal de le faire?

49
cleg

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

61

si vous avez un objet, vous pouvez le définir comme @property pour 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 %>
19
sherpya

Je passe au template de Django une fonction, qui me renvoie quelques enregistrements

Pourquoi ne passez-vous pas à Django modèle la valeur de retour de la fonction de stockage de variable, 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 la variable, mais il semble qu'il n'y ait aucun moyen de définir la variable dans le modèle Django.

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

10
dolma33

De par leur conception, les modèles Django ne peuvent pas appeler de code arbitraire Python. Il s'agit d'une fonction de sécurité et de sûreté pour les environnements où les concepteurs écrivent des modèles, et il empêche également la logique métier). migration vers des modèles.

Si vous voulez faire cela, vous pouvez passer à l'utilisation de modèles Jinja2 ( http://jinja.pocoo.org/docs/ ), ou tout autre système de modèles que vous aimez qui prend en charge 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 de nombreux systèmes de modèles différents dans le même projet si vous le souhaitez.

5
Marcin

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

Inside index.html

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

Inside 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
sidmanu