Question

Donc, j'ai un champ décimal qui peut être 3 valeurs différentes. À mon avis, Je passe un dictionnaire de valeurs contenant la décimale appropriée des valeurs en tant que clés.

{% for item in booklist %}  
    {% for key, value in numvec.items %}  
        {{item.number}}  
        {% ifequals item.number {{key}} %}  
            {{value}}  
        {% endifequals %}  
    {% endfor %}
{% endfor %}

c'est le dict que je passe en numvec:

numvec = {"TEST":Decimal("0.999"), "TEST2":Decimal("0.500"),

"TEST3": Decimal ("0.255")}

le champ numérique a été défini comme ayant ces choix dans mon modèle:

BOOK_CHOICES=((Decimal("0.999"), 'TEST'),(Decimal("0.500"), 'TEST2'),(Decimal("0.255"), 'TEST3'),)

Le numéro d'article est imprimé correctement dans la vue si je compare le dict avec l'attribut, mais pour une raison quelconque, les ifequals ne peuvent pas correctement comparez deux décimales ensemble. Est-ce un bug ou est-ce que je fais quelque chose? mal dans mon modèle avec ifequals?

Était-ce utile?

La solution

Selon cette , il semble que vous puissiez seulement comparer les chaînes. Je créerais mon balise de modèle si j'étais vous.

Autres conseils

Ce n'est pas un bug et il est possible de réaliser ce que vous essayez de faire.

Cependant, tout d’abord, quelques remarques sur votre code:

  • Il n'y a pas "ifequals / endifequals" opérateur. Vous pouvez utiliser & if; ifequal / endifequal & ; ou "if / endif" .
  • Deuxième chose. Votre code {% ifequal item.number {{key}}%} provoquerait une exception TemplateSyntaxError si vous laissez des doubles accolades à l'intérieur du " ifequal " ou " si " opérateur.

Maintenant la solution :

  1. Il vous suffit simplement d'utiliser le & string; stringformat & ; filtre pour convertissez vos valeurs décimales en chaîne.
  2. Ignorez les accolades lorsque vous utilisez des variables à l'intérieur d'opérateurs.
  3. N'oubliez pas cette variable à l'intérieur d'un " if " ou " ifequal " l'opérateur est toujours représenté par une chaîne.

Voici un exemple :

{% for item in decimals %}  
  {% if item|stringformat:"s" == variable %}  
    {{ variable }}
  {% endif %}  
{% endfor %}

La solution:

{% for item in decimals %}  
  {% if item|stringformat:"s" == variable %}  
    {{ variable }}
  {% endif %}  
{% endfor %}

fonctionne bien pour comparer un nombre décimal (comme la boucle) à une chaîne (comme une valeur passée)

La solution la plus simple consiste à définir une méthode sur le modèle qui encapsule la logique numérique et renvoie la chaîne conviviale.

Vous pouvez également écrire une balise de gabarit pour le faire, ce qui représente beaucoup plus de code, mais conserve peut-être un peu mieux la séparation des couches modèle / vue.

On ne sait pas si cela aiderait Ardesco, mais il existe template_utils qui a if_greater , if_greater_or_equal , if_less , if_less_or_equal (entre autres) qui résolvent des cas très proches où ifequals simple ne suffit pas.

après l’installation, ajoutez simplement template_utils et configurez votre fichier django settings.py sous INSTALLED_APPS , puis insérez {%% de comparaison de charge%} dans votre modèle

En revanche, les nombres tels que 1.1 et 2.2 n’ont pas de représentation exacte en virgule flottante binaire. > >

E.g. si vous

print Decimal(3.59)

vous obtenez

3.589999999999999857891452847979962825775146484375

Donc, si vous comparez deux décimales dans un modèle django, mieux vaut utiliser la réponse de @Oleg Sakharov, ou vous pouvez également utiliser la même méthode, mais une chaîne de formatage différente, telle que:

if item|stringformat:".2f" == "3.59"
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top