How to Handle Empty For-Loops in Django Templates

To handle scenarios where you need to render something even if a loop in Django templates is empty, you can use Django’s template language to display content conditionally. Django templates offer {% for %} loops and {% empty %} tags to manage such cases.

Imagine you have a list of blog posts that you want to display in a template. If there are no blog posts, you want to show a message indicating that there are no posts available.

Django View

First, you set up a view in your views.py to pass a list of blog posts to the template.

# views.py
from django.shortcuts import render

def blog_view(request):
    blog_posts = []  # Empty list for demonstration
    return render(request, 'blog_template.html', {'blog_posts': blog_posts})

Django Template

In your blog_template.html, you will use {% for %} to iterate over blog_posts and {% empty %} to handle the case where the list is empty.

<!-- blog_template.html -->
{% if blog_posts %}
    <ul>
        {% for post in blog_posts %}
            <li>{{ post.title }} - {{ post.content }}</li>
        {% empty %}
            <li>No blog posts available.</li>
        {% endfor %}
    </ul>
{% else %}
    <p>No blog posts available.</p>
{% endif %}

Empty Shopping Cart Handling

In Django templates, display cart items if present; otherwise, show a message encouraging users to browse products. This ensures clarity and engagement regardless of cart content.

<h2>Your Shopping Cart</h2>

{% if cart_items %}
    <ul>
    {% for item in cart_items %}
        <li>
            {{ item.name }} - {{ item.quantity }} x {{ item.price|currency }}
        </li>
    {% endfor %}
    </ul>
    <p>Total: {{ total_price|currency }}</p>
{% else %}
    <p>Your cart is empty. Browse our <a href="{% url 'product_list' %}">products</a> to add items.</p>
{% endif %}