1

I'm trying to build a website for tv series using Django framework, I put in the models.py all kinds of details about that show and a JSONField (named 'episodes') to define the number seasons and episodes in each season.
Example: { "1" : 15 , "2" : 25 , "3" : 23}
where season 1 contains 15 episodes, 2 contains 25 and so on

the problem starts when I tried making a dropdown in the template where the series is playing so the user can select the episode to watch: This Code is working:

    Season 1
    {% with ''|center:show.episodes.1 as range %}
    {% for episode in range %}
        Episode {{forloop.counter}}
    {% endfor %}
    {% endwith %}

    Season 2
    {% with ''|center:show.episodes.2 as range %}
    {% for episode in range %}
        Episode {{forloop.counter}}
    {% endfor %}
    {% endwith %}

    Season 3
    {% with ''|center:show.episodes.3 as range %}
    {% for episode in range %}
        Episode {{forloop.counter}}
    {% endfor %}
    {% endwith %}

But surely this can be much cleaner if I could use 2 for loops inside each others one for the seasons and one for the episodes which sounds easy but for some reason I couldn't do it.
I tried:

{% for season in show.episodes %}
    Season {{forloop.counter}}
    {% for episode in show.episodes.forloop.counter %}
        Episode {{forloop.counter}}
    {% endfor %}
{% endfor %}

yes it is that show.episodes.forloop.counter line stopping me.
that definitely won't work, I tried doing:

{% for season in show.episodes %}
    Season {{forloop.counter}}
    {% for episode in show.episodes|add:forloop.counter %}
        Episode {{forloop.counter}}
    {% endfor %}
{% endfor %}

But that doesn't work because I am trying to add the number to the already loaded show.episodes which is the dict of the JSON (Error)

I also tried doing a custom filter like in this Question : How to assemble a variable name in Django templating language? but looks like the same thing is happening: adding the number to the already loaded show.episodes which is the dict of the JSON (Error)


I know it seems very easy but for 2 days I have been trying to figure out a solution and I couldn't, So If you can, Please help me. I am quite a beginner btw :)

  • how about normal `range(1, show.episodes+1)` - but I'm not sure if it works in template. Eventually you could use `range()` before you send data to template `{ "1" : range(15) , "2" : range(25) , "3" : range(23)}` – furas Apr 04 '22 at 12:58
  • @furas , Unfortunately range() doesn't work in template. and I can't write `{ "1" : range(15) , "2" : range(25) , "3" : range(23)}` because range() is not valid JSON – Youssef Ihab Apr 04 '22 at 14:07

1 Answers1

1
show.episodes = { "1" : 15 , "2" : 25 , "3" : 23}

Propose to iterate through your dict this way:

{% for season, series in show.episodes.items %}
    Season {{ season }}
    
           {% for _ in ''|center:series %}
                Episode {{forloop.counter}}
           {% endfor %}

{% endfor %}

It is ok for not big dictionaries. To process bigger dicts I propose to use custom template filters or tags. Or move processing logic to view function.

Docs for filter and tags https://docs.djangoproject.com/en/3.2/howto/custom-template-tags/#custom-template-tags-and-filters

ale
  • 79
  • 3