Sergei_Erjemin
@Sergei_Erjemin
Улыбайся, будь самураем...

Как «преобразовать типы» и починить странную работу if в Jinja?

Столкнулся со странностью работы шаблонизатора Jinja в Django. Нужно установить selected для обработанного выпадающего списка option. Делаю так:

<select name="ft">
    <option value="0">Все ({{ total_item }} шт.)</option>{% for i in menu_typ %}
    <option value="{{ i.id }}"{% if request.GET.ft == i.id %} selected{% endif %}>
        {{ i.szName|capfirst }} ({{ i.Num }} шт.)
    </option>{% endfor %}
</select>


Никаких selected ни для одного option не появляется.
, {% if request.GET.ft == i.id %} не срабатывает в принципе. Всевозможные эксперименты показали, что причина несоответствие типов: i.id -- число; request.GET.ft -- строка. Привести обе переменные к одному типу удалось с помощью костыля add -- {% if request.GET.ft|add:0 == i.id|add:0 %}. Таким образом, если сделать вот так:

<select name="ft">
    <option value="0">Все ({{ total_item }} шт.)</option>{% for i in menu_typ %}
    <option value="{{ i.id }}"{% if request.GET.ft|add:0 == i.id %} selected{% endif %}>
        {{ i.szName|capfirst }} ({{ i.Num }} шт.)
    </option>{% endfor %}
</select>


Всё работает. Это костыль, или все так делают? Какие ещё есть варианты??
  • Вопрос задан
  • 534 просмотра
Пригласить эксперта
Ответы на вопрос 2
@Animkim
Питон вокруг меня
Не проще там же где и menu_typ, всё это дело обработать и вернуть список какого-то такого вида:
[{'object': object, 'selected': 'selected'},  {...}, {...}]

# html
{% for item in menu_typ %}
   <option value="{{ item.object.id }}" {{ item.selected }}>
        {{ item.object.szName|capfirst }} ({{ item.object.Num }} шт.)
    </option>
{% endfor %}

или [(object, 'selected'),  {object, ''), (...)]

{% for item, selected in menu_typ %}
   <option value="{{ item.id }}" {{ selected  }}>
        {{ item.szName|capfirst }} ({{ item.Num }} шт.)
    </option>
{% endfor %}
Ответ написан
skipirich
@skipirich
проходил мимо
я бы во вьюхе в контекст добавил переменную ft = int(request.GET.ft) и в шаблоне сравнивал их {% if ft == i.id %}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы