Dis que j'ai un modèle
<html>
<div>Hello {{name}}!</div>
</html>
Lors de son test, il serait utile de définir la valeur de la variable sans toucher au code python qui invoque ce modèle. Je cherche donc quelque chose comme ça
{% set name="World" %}
<html>
<div>Hello {{name}}!</div>
</html>
Est-ce que quelque chose comme ça existe dans Django?
django
django-templates
Alexis
la source
la source
Créez une balise de modèle:
L'application doit contenir un
templatetags
répertoire, au même niveau quemodels.py
,views.py
etc. Si cela n'existe pas, créez - ne pas oublier le__init__.py
fichier pour vous assurer que le répertoire est traité comme un package Python.Créez un fichier nommé à l'
define_action.py
intérieur du répertoire templatetags avec le code suivant:Remarque: le serveur de développement ne redémarrera pas automatiquement. Après avoir ajouté le
templatetags
module, vous devrez redémarrer votre serveur avant de pouvoir utiliser les balises ou les filtres dans les modèles.Ensuite, dans votre modèle, vous pouvez attribuer des valeurs au contexte comme ceci:
la source
add
:{% define counter|add:1 as counter %}
. De même pour les autres opérations.Une autre méthode qui ne nécessite pas que vous mettiez tout dans le bloc "avec" consiste à créer une balise personnalisée qui ajoute une nouvelle variable au contexte. Un péché:
Cela vous permettra d'écrire quelque chose comme ça dans votre modèle:
Notez que la plupart de ces informations ont été prises à partir d'ici
la source
Il y a des astuces comme celle décrite par John; cependant, le langage de gabarit de Django de par sa conception ne prend pas en charge la définition d'une variable (voir la boîte "Philosophie" dans la documentation de Django pour les modèles ).
Pour cette raison, la méthode recommandée pour modifier une variable consiste à toucher le code Python.
la source
La meilleure solution pour cela est d'écrire une coutume
assignment_tag
. Cette solution est plus propre que l’utilisation d’unwith
balise car elle permet une séparation très nette entre la logique et le style.Commencez par créer un fichier de balises de modèle (par exemple.
appname/templatetags/hello_world.py
):Vous pouvez maintenant utiliser la
get_addressee
balise de modèle dans vos modèles:la source
Peut-être que le
default
filtre de modèle n'était pas une option en 2009 ...la source
{% with state=form.state.value|default:other_context_variable %}
au lieu de,other_context_variable
nous pouvons également en utiliser'string_value'
égalementCe n'est pas une bonne idée en général. Faites toute la logique en python et passez les données au modèle pour les afficher. Le modèle doit être aussi simple que possible pour garantir que ceux qui travaillent sur la conception puissent se concentrer sur la conception plutôt que de se soucier de la logique.
Pour donner un exemple, si vous avez besoin d'informations dérivées dans un modèle, il est préférable de les insérer dans une variable dans le code python, puis de les transmettre au modèle.
la source
Utilisez l' instruction with .
Je ne peux pas impliquer le code dans le premier paragraphe de cette réponse . Peut-être que le langage du modèle avait déprécié l'ancien format.
la source
Dans votre modèle, vous pouvez faire ceci:
Dans vos balises de modèle, vous pouvez ajouter une balise comme celle-ci:
la source