Как собрать имя переменной, чтобы использовать данные из JSONField внутри шаблона в django?
Я пытаюсь создать сайт для сериалов, используя фреймворк Django, я поместил в models.py всевозможные подробности о сериале и JSONField (с именем 'episodes') для определения количества сезонов и эпизодов в каждом сезоне.
.
Пример: { "1" : 15 , "2" : 25 , "3" : 23}
где 1 сезон содержит 15 эпизодов, 2 - 25 и так далее
.
проблема начинается, когда я пытаюсь сделать выпадающий список в шаблоне, где воспроизводится серия, чтобы пользователь мог выбрать эпизод для просмотра:
Этот код работает:
{% if show.episodes.1 %}
Season 1
{% with ''|center:show.episodes.1 as range %}
{% for episode in range %}
Episode {{forloop.counter}}
{% endfor %}
{% endwhile %}
{% endif %}
{% if show.episodes.2 %}
Season 2
{% with ''|center:show.episodes.2 as range %}
{% for episode in range %}
Episode {{forloop.counter}}
{% endfor %}
{% endwhile %}
{% endif %}
{% if show.episodes.3 %}
Season 3
{% with ''|center:show.episodes.3 as range %}
{% for episode in range %}
Episode {{forloop.counter}}
{% endfor %}
{% endwhile %}
{% endif %}
Но, конечно, это может быть намного чище, если я могу использовать 2 цикла for внутри друг друга, один для сезонов, другой для эпизодов, что звучит просто, но по какой-то причине я не смог этого сделать.
Я пробовал:
{% for season in show.episodes %}
Season {{forloop.counter}}
{% for episode in show.episodes.forloop.counter %}
Episode {{forloop.counter}}
{% endfor %}
{% endfor %}
да, именно эта строка show.episodes.forloop.counter останавливает меня.
это точно не сработает, я попробовал сделать:
{% for season in show.episodes %}
Season {{forloop.counter}}
{% for episode in show.episodes|add:forloop.counter %}
Episode {{forloop.counter}}
{% endfor %}
{% endfor %}
Но это не работает, потому что я пытаюсь добавить номер к уже загруженному show.episodes, который является диктом JSON (Error)
.
Я также попытался сделать пользовательский фильтр, как в этом вопросе : Как собрать имя переменной в языке шаблонов Django?
но похоже, что происходит то же самое: добавление числа к уже загруженному show.episodes, который является диктом JSON (Error)
Я знаю, что это кажется очень простым, но в течение 2 дней я пытался найти решение и не смог, поэтому, если вы можете, пожалуйста, помогите мне. Я совсем новичок :)
Предлагаю выполнить итерации через ваш dict таким образом:
show.episodes = { "1" : 15 , "2" : 25 , "3" : 23}
{% for season, series in show.episodes.items %}
Season {{ season }}
{% for _ in ''|center:series %}
Episode {{forloop.counter}}
{% endfor %}
{% endfor %}
Кстати, в вашем первом фрагменте кода есть опечатка (использование %endwhile% вместо %endwith%)
Это нормально для не больших словарей. Для обработки больших словарей я предлагаю использовать пользовательские фильтры шаблонов или теги. Или перенести логику обработки в функцию представления.
Документы для фильтра и тегов https://docs.djangoproject.com/en/3.2/howto/custom-template-tags/#custom-template-tags-and-filters