Django TypeError: 'Category' object is not iterable in template loop

1️⃣ Problem Description: I'm working on a Django project where I'm trying to display a category and its associated products. However, I'm getting the following error in my template:

2️⃣ Error Message:

TypeError at /category/2/'Category' object is not iterableRequest Method:   GETRequest URL: http://127.0.0.1:8000/category/2/Django Version:    5.1.4Exception Type:    TypeErrorException Value:   'Category' object is not iterableException Location:    C:\Users\brahm\OneDrive\Desktop\Django\one\Lib\site-packages\django\template\defaulttags.py, line 198, in renderRaised during:  accounts.views.categoryPython Executable:   C:\Users\brahm\OneDrive\Desktop\Django\one\Scripts\python.exePython Version:    3.11.5Python Path:  ['C:\Users\brahm\OneDrive\Desktop\Django\one\Scripts\user_authincation','C:\Program Files\Python311\python311.zip','C:\Program Files\Python311\DLLs','C:\Program Files\Python311\Lib','C:\Program Files\Python311','C:\Users\brahm\OneDrive\Desktop\Django\one','C:\Users\brahm\OneDrive\Desktop\Django\one\Lib\site-packages']Server time: Wed, 26 Feb 2025 06:25:55 +0000

3️⃣ My Django View (views.py):

`def category(request,id):
    categories =Category.objects.get(id=id)
    products=Product.objects.filter(category=categories)
    context={
        'categories':categories,
        'products':products,
    }
    return render(request,'category.html',context)`

4️⃣ My Django Template (category.html):

{% for category in categories %}
     <a class="nav-link" href="/category/{{category.id}}/">{{category.name}}</a>
{% endfor %}

urls.py

urlpatterns=[
    #path('home',home,name='home'),
    #path('',register,name='register'),
    #path('login/',login_user,name='login'),
    #path('logout/',logout_user,name='logout'),
    path('category/<int:id>/',category,name='category'),
]

models.py

class Category(models.Model):
    name=models.CharField(default='uncategorized',max_length=100)
    is_active=models.BooleanField(default=True)

    def __str__(self):
        return self.name

class Product(models.Model):

    category=models.ForeignKey(Category,on_delete=models.CASCADE,related_name='categories')       
    product_name=models.CharField(max_length=120)
    img=models.ImageField(upload_to='photos/')
    created_date=models.DateTimeField(auto_now=True)
    desc=models.TextField()
    price=models.CharField(max_length=8)


    def __str__(self):
        return self.product_name

5️⃣ Expected Behavior: I want to display the category name and list of products under it.

6️⃣ Issue: Since category is a single object, it is not iterable, but my template uses {% for category in categories %}.

7️⃣ My Question: What is the correct way to access a single object in a Django template? Should I change my view or update my template?

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