Шаблон Django ifequal сравнение десятичных знаков - PullRequest
1 голос
/ 14 января 2009

Итак, у меня есть десятичное поле, которое может принимать 3 разных значения. По-моему, Я передаю в словарь значений, который содержит соответствующий десятичный значения в виде ключей.

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

это диктовка, которую я передаю как numvec:

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

"TEST3": Десятичный ( "0,255")}

числовое поле было определено как имеющее эти варианты в моей модели:

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

Номер товара распечатывается очень хорошо, если я сравниваю с атрибутом, но по какой-то причине ifequals не может должным образом сравнить два десятичных знака вместе. Это ошибка, или я что-то делаю неправильно в моем шаблоне с ifequals?

Ответы [ 6 ]

11 голосов
/ 15 апреля 2010

Это не ошибка, и возможно добиться того, что вы пытаетесь сделать.

Однако, прежде всего несколько замечаний о вашем коде:

  • Оператор "ifequals / endifequals" отсутствует. Вы используете "ifequal / endifequal" или "if / endif" .
  • Второе. Ваш код {% ifequal item.number {{key}} %} вызовет исключение TemplateSyntaxError, если вы оставите двойные фигурные скобки внутри оператора "ifequal" или "if".

Теперь решение :

  1. Просто используйте "stringformat" filter для преобразования ваших десятичных значений в строку.
  2. Пропускать фигурные скобки при использовании переменных внутри операторов.
  3. Не забывайте, что эта переменная внутри оператора if или ifequal всегда представляется в виде строки.

Вот пример :

{% for item in decimals %}  
  {% if item|stringformat:"s" == variable %}  
    {{ variable }}
  {% endif %}  
{% endfor %}
2 голосов
/ 29 июля 2010

Решение:

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

хорошо подходит для сравнения десятичного числа (например, цикла) со строкой (например, переданного значения)

2 голосов
/ 14 января 2009

Согласно это , кажется, что вы можете сравнивать только строки. Я бы сделал свой собственный шаблон тега на вашем месте.

0 голосов
/ 06 ноября 2014

Напротив, числа типа 1.1 и 2.2 не имеют точных представлений в двоичной с плавающей запятой. >>

например. если вы

print Decimal(3.59)

вы получите

3.589999999999999857891452847979962825775146484375

Так что, если вы сравниваете два десятичных знака в шаблоне django, лучше использовать ответ, который есть у @Oleg Sakharov, или вы можете использовать тот же метод, но другую строку форматирования, например:

if item|stringformat:".2f" == "3.59"
0 голосов
/ 16 июня 2009

Не совсем ясно, поможет ли это Ardesco, но есть template_utils , который имеет if_greater, if_greater_or_equal, if_less, if_less_or_equal теги (среди прочих), которые решают очень похожие случаи простого ifequals не достаточно.

после установки просто добавьте template_utils, сделайте django settings.py под INSTALLED_APPS и затем поместите {% load comparison %} в свой шаблон

0 голосов
/ 15 января 2009

Самое простое решение - определить метод в модели, который инкапсулирует числовую логику и возвращает удобную для человека строку.

Или вы можете написать для этого тег шаблона, который содержит гораздо больше кода, но, возможно, немного лучше разделяет слой модель / вид.

...