Home > other >  How do I iterate ManyToMany field in Django template tag?
How do I iterate ManyToMany field in Django template tag?

Time:02-01

So I have an object that contains a Many-to-Many field. I'm trying to iterate this field in Django template, but apparently I can't. Let me show you the code first.
model

class Book(models.Model):
    title = models.CharField(max_length = 100, blank=True)
    category = models.ManyToManyField(Category)

    def __str__(self):
        return self.title

views.py

def book_list(request):
    books = Book.objects.all().order_by('-pk')
        
    context = {
        'books' : books,
    }
    return render(request, 'contents/book_list.html', context)

Now template.

{% for b in books %}
<div>
    {{b.title}}
    {% for cat in b.category %}
    {{cat}}
    {% endfor %}
</div>
{% endfor %}

Now I get 'ManyRelatedManager' object is not iterable error. How do I iterate the field and show all the category in each object? Thanks.

CodePudding user response:

It's because if you call b.category it returns only the relation object. To get its values (category objects) you have to add .all. Like this:

{% for b in books %}
<div>
    {{ b.title }}
    {% for cat in b.category.all %}
        {{cat}}
    {% endfor %}
</div>
{% endfor %}

btw. I've also changed c.title to b.title, because I assume you want this book title, not something from global :)

  •  Tags:  
  • Related