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?