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?
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.
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 %>
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.
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.
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> Download</a>
</div>
</li>
{% endfor %}
</ul>