Как динамически получить доступ к элементам списка в шаблоне django jinja, используя переменную индексацию

Ошибка шаблона Django jinja - TemplateSyntaxError

Я пытался создать примерную страницу пользователей, где я хочу показать имя пользователя, пароль и роль пользователей. Я буду хранить роль в виде чисел, а позже я попытаюсь получить имя роли из списка.

Я жестко закодировал имена этих ролей в список roles = ['admin', 'teacher', 'student'] эти роли были переданы на html-страницу как значение контекста. Кроме того, я передаю переменную num для доступа к элементам списка (atm ее значение также жестко запрограммировано, я изменю это в будущем)

просмотры.py

def index(request):
   roles = ['admin', 'teacher', 'student']
   num=1
   return render(request=request, template_name='show_all.html', context = {'roles': roles, 'num': num})

и внутри моей html-страницы я пытаюсь получить доступ к этому списку, используя переменную num, как указано ниже.

show_all.html

{{roles[num]}}
но выдает ошибку

TemplateSyntaxError в /show_all
Не удалось разобрать остаток: «[число]» из «ролей [число]».

есть несколько решений, которые говорят, что roles.0 даст вам первый результат, а roles.1 даст следующий, но я не хочу жестко кодировать там индекс.

требования.txt

asgiref==3.5.2
Django==4.1.3
sqlparse==0.4.3
tzdata==2022.6

я пытался

{{roles.num}}
{{roles.get(num)}}
{{roles[num]}}

ничего не дает мне желаемого результата.

Почему бы не проиндексировать само представление и не перейти к jinja

ilyasbbu 18.11.2022 04:37

@ilyasbbu это именно то, что я предложил в своем решении.

allexiusw 18.11.2022 04:41

это будет работать здесь, но у меня есть некоторые планы реализовать это с помощью list. Таким образом, переменная num будет изменена на список. поэтому здесь необходимо что-то похожее на это решение, например, какие-то методы jinja или что-то, что работает внутри jinja. stackoverflow.com/questions/57149694/…

Harikrishnan.A.S - 19.11.2022 02:14
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
3
71
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Лучший подход:

def roli(roles, i):
    """Return the rol[i]"""
    return roles[i]

В Джиндже:

{{ roles|roli:i }}

Я бы порекомендовал вам прочитать документацию о tags: https://docs.djangoproject.com/en/4.1/howto/custom-template-tags/ вам нужны дополнительные шаги для регистрации тега шаблона.

Другой подход. Обходной путь может быть следующим:

def index(request):
   roles = ['admin', 'teacher', 'student']
   num=1
   return render(request=request, template_name='show_all.html', context = {'roles': roles, 'num': num, 'rolesi': roles[num]})

А потом: show_all.html

{{rolesi}}

Да сработает. Но на самом деле я не хочу менять там код Python. Вместо этого я хотел иметь это в шаблоне jinja. Есть ли способ сделать это?

Harikrishnan.A.S - 19.11.2022 01:50

В моем случае я буду реализовывать базу данных. И будет хранить роли пользователей в таблице вместе с некоторыми другими полями. Так что окончательные данные (принимая только роли в качестве списка) будут выглядеть как model_roles=[1,2,1,3], я проведу цикл по этому списку и на основе текущего индекса я буду печатать там имя_роли. Пробовали поставить условие if в jinja. Но это может быть не масштабируемо. Поэтому я просто хотел получить что-то масштабируемое 😃

Harikrishnan.A.S - 19.11.2022 01:56

@ Harikrishnan.AS- просмотрите обновленный ответ ...

allexiusw 19.11.2022 05:47

Да, это сработало. Большое спасибо, также, как вы упомянули в ответе, я должен был просмотреть, настроив Custom template tags and filters. Большое спасибо за изучение этого вопроса.

Harikrishnan.A.S - 20.11.2022 09:30

Другие вопросы по теме