Как собрать имя переменной, чтобы использовать данные из 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

Вернуться на верх