Flask, Jinja2 и не могу понять, как работает selected option

250
02 марта 2022, 19:30

Имеется проблема. Оформляю админ панель, страница делится на две части.

В левой - селект с юзернеймами

<select class="custom-select"> 
  {% for element in userlist %} 
    <option value='{{ url_for("admin", user=element) }}' {% if user==element %}selected{% endif %} onclick='location=value'>{{ element }}</option> 
  {% endfor %} 
</select>

В правой части селект с записями юзера

<select class="custom-select"> 
  {% for item in content_list %} 
    <option value='{{ url_for("admin", user=user, ID=item["id"]) }}' {% if item.get('id')==curelem  %}selected{% endif %}  onclick='location=value'>{{ item["name"] }}</option> 
  {% endfor %} 
</select>

На вход подается

userlist - список вида ['Grigorij', 'Anatoliy', 'Ktougodno']

content_list - список со словарями [{'id':id, 'name':name, 'etc':etc}, {'id':id, 'name':name, 'etc':etc}]

curelem - id текущего выбранного элемента, который получаю с запросом из аргумента ID, а затем передаю его в рендер шаблона так render_template('admin.html', userlist=userlist, content_list=content_list, curelem=request.args.get('ID'))

Так вот, второй селект, который с контентом, выбирает selected'ом все время первый элемент при том, что опытным путем было выяснено, что item["id"] у каждой опции верный, curelem все время имеет верное значение, при нажатии на опцию происходит переход туда, куда надо, то есть внешне вроде бы все работает как и должно, но селект ведет себя как то необычно.

Answer 1

Тест части вашего шаблона с Jinja2:

from jinja2 import Template
template_html = '''
<select class="custom-select">
  {% for item in content_list %}
    <option value='{{ url_for("admin", user=user, ID=item["id"]) }}' {% if item.get('id')==curelem  %}selected{% endif %}  onclick='location=value'>{{ item["name"] }}</option>
  {% endfor %}
</select>
'''
template = Template(template_html)
params = {
    'content_list': [
        {'id': 368469, 'name': 'kliff', 'etc': 'welcome to ruSO!'},
        {'id': 198251, 'name': 'aiv', 'etc': '..respondent..'},
    ],
    'url_for': lambda x, user, ID: 'https://ru.stackoverflow.com/users/{}'.format(ID),
    'curelem': 198251,
}
print(template.render(**params))

Даёт правильный результат с опцией selected в нужном месте:

<select class="custom-select">  
    <option value='https://ru.stackoverflow.com/users/368469' onclick='location=value'>kliff</option>
    <option value='https://ru.stackoverflow.com/users/198251' selected onclick='location=value'>aiv</option>
</select>

Советы:

  1. Проверяйте типы аргументов, возможно у вас в curelem число в виде строки, а в словаре в виде int или наоборот – при беглом просмотре легко упустить эту важную деталь.
  2. А может вы забыли передать curelem в параметры шаблона? К счастью или сожалению, это не считается ошибкой, отсутствующий параметр будет подставляться как None.
  3. Проверяйте получающийся HTML-код, а не только получившуюся страничку в браузере.
  4. Старайтесь локализовать ошибку, копируйте и выполняйте отдельный кусок своего кода, проверяйте корректность его выполнения и типы значений на всех этапах (можно даже оптимизировать процесс используя двоичный поиск), так Вы быстро найдёте место возникновение проблемы и её причину.

И ещё, использовать имена вида curelem и element в одном пространстве имён для разных типов данных очень нехорошо. Лучше длинные, но внятные имена вроде current_user_id, selected_menu_id и т.п.

READ ALSO
Как нормально вывести текст с тегами?

Как нормально вывести текст с тегами?

Есть текст по типу: <p>Explore a vast, beautiful, and immersive world<br /> Explore a vast, beautiful, immersive, and dangerous world filled with gripping enemy encounters, challenging puzzles and thrilling escape sequencesUnravel...

106
Как xpath найти все элементы по классу и его подстроке?

Как xpath найти все элементы по классу и его подстроке?

Уважаемые пользователи stackoverflow, здравствуйтеНужен ваш совет

161
Одинаковая реакция

Одинаковая реакция

Как сделать чтобы при наведению на картинку svg, тултип который срабатывает при наведение на кнопку срабатывал тоже?

98
Подскажите почему на странице перестал работать select плагина jQuery Form Styler

Подскажите почему на странице перестал работать select плагина jQuery Form Styler

Подскажите, пожалуйста, почему перестал работать плагин jQuery Form Styler на страницеВчера еще работа, сегодня - нет

101