Search code examples
djangopython-3.xdjango-templatesdjango-viewsslug

NoReverseMatch when rendering page


I seem to know where the issue is located since I can get around it, but for getting around it I have to sacrifice a function I really want to keep.

Here is the relevant code in the non-working state:

{% if sections %}

        {% for item in sections %}

            <a class="sections" href="{% url 'sections:generate' item.section.slug %}">{{ item.section.title }}</a>

            {% for subsection in item.subsections %}

                <p>{{ subsection.title }}</p>

            {% endfor %}

        {% endfor %}

    {% else %}

        <p>Error retrieving sections or no sections found</p>

    {% endif %}

The problem part above is in the link tag. Let me explain by showing the related view.py:

def index(request):
    sections = Section.objects.all()
    context = {
        'sections': [],
    }

    for section in sections:
        context.get("sections").append(
            {
                'section': section,
                'subsections': get_subsections(section),
            }
        )

    return render(request=request, template_name='index.html', context=context)

So, 'sections' is an iterable list of items, containing for every items a dictionary with two entries. One, 'section' and one 'subsection'. There are multiple subsections for every section, this is what I really want to accomplish.

Ordinarily, when not bothering with subsections and simply iterating over a list of sections works fine. The template code for that would look something like:

{% for section in sections %}

    <a href="{% url 'sections:generate' section.slug %}">{{ section.title }}</a>

{% endfor %} 

NOTE! The code above works just fine! But as soon as I add 'sections' as a list of dictionaries and have to reference the slug by item.section.slug the pages stop rendering.

Please advise.


Solution

  • Try using tuples:

    View:

    context['sections'] = [(section, tuple(get_subsections(section))) for section in sections]
    

    Template:

    {% for section, subsections in sections %}
        <a class="sections" href="{% url 'sections:generate' section.slug %}">{{ section.title }}</a>
        {% for subsection in subsections %}
            <p>{{ subsection.title }}</p>
        {% endfor %}
    {% endfor %}