web-dev-qa-db-fra.com

Django Opérateur ternaire de modèle

Je me demandais s'il y avait un opérateur ternaire (condition? True-value: false-value) qui pourrait être utilisé dans un modèle Django. Je vois qu'il y a un python one (true-value if condition else false-value) mais je ne sais pas comment l'utiliser à l'intérieur d'un modèle Django pour afficher le html donné par l'une des valeurs. Toutes les idées ?

54
Anon

Pourquoi auriez-vous besoin d'un opérateur ternaire dans un modèle? {% if %} et {% else %} sont tout ce dont vous avez besoin.

Ou vous pouvez essayer la balise firstof:

{% firstof var1 var2 var3 %}

qui sort le premier de var1, var2 ou var3 qui donne une valeur True.

32
Daniel Roseman

Vous pouvez utiliser le filtre yesno:

{{ value|yesno:"yeah,no,maybe" }}

https://docs.djangoproject.com/en/1.9/ref/templates/builtins/#yesno

75
jeroenp

Tout simplement parce qu'ils n'ont pas encore été mentionnés ici: les balises de modèle intégrées default et default_if_none peut être utile dans des circonstances simples:

default

Si la valeur est évaluée à False, utilise la valeur par défaut donnée. Sinon, utilise la valeur.

Par exemple:

{{ value|default:"nothing" }}

Si la valeur est "" (la chaîne vide), la sortie ne sera rien.

default_if_none

Si (et seulement si) la valeur est None, utilise la valeur par défaut donnée. Sinon, utilise la valeur>.

Notez que si une chaîne vide est donnée, la valeur par défaut ne sera pas utilisée. Utilisez> le filtre par défaut si vous souhaitez utiliser des chaînes vides.

Par exemple:

{{ value|default_if_none:"nothing" }}

Si la valeur est None, la sortie sera la chaîne "rien".

https://docs.djangoproject.com/en/1.9/ref/templates/builtins/#default

18
ptim

Je viens d'implémenter l'opérateur ternaire pour Django comme une balise, voir https://github.com/alexei/Django-template-extensions Vous pouvez l'utiliser comme:

{% ?: exp1 exp2 exp3 %}
{% ?: exp1 exp2 %}

Ou:

{% iif exp1 exp2 exp3 %}
{% iif exp1 exp2 %}

J'ai compris que cela avait plus de sens que le filtre yesno, même si ce n'est vraiment pas Pythonic.

5
Alexei

Non. Le Django {% if %} templatetag vient juste de commencer à supporter ==, and, etc. {% if cond %}{% else %}{% endif %} est aussi compact que possible pour l'instant.

4
Oli

Je me demande si le python et/ou astuce fonctionnerait?

condition and true_value or false_value

se comporte comme l'opérateur ternaire - renvoie true_value si la condition est évaluée à True et false_value sinon.

1
hwjp