Pourquoi est-ce que je reçois cette erreur?
models.py
{% for category in categories %}
<a class="dropdown-item" href="{% url 'category' pk=category.id %}">{{ category.name }}</a>
{% endfor %}
views.py
urlpatterns = [
path('', views.index),
url(r'^category/(?P<pk>\d+)$', views.category, name='category'),
]
urls.py
def category(request, pk):
categories = Category.objects.get(id=pk)
subcategories = SubCategory.objects.filter(category=categories)
return render(request, 'category.html', {'categories': categories, 'subcategories': subcategories})
base.html
class Category(models.Model):
name = models.CharField(max_length=100)
description = models.TextField()
def __str__(self):
return self.name
class SubCategory(models.Model):
name = models.CharField(max_length=100)
category = models.ForeignKey(Category, on_delete=models.CASCADE)
image_url = models.CharField(default=0, max_length=2000)
price = models.IntegerField(default=0)
3 Réponses :
get renvoie une instance de modèle, pas un ensemble de requêtes (malgré votre nom de variable trompeur):
{% for category in categories %} # instance cannot be looped over!
Par conséquent:
categories = Category.objects.get(id=pk) # instance, not queryset!
Juste {{categories.name}} sans boucle, pour commencer. Mais vous devriez vraiment changer le nom de cette variable de contexte en un nom singulier.
Vous essayez d'obtenir un seul objet Category dans le fichier ci-dessous.
views.py
def category(request, pk):
categories = Category.objects.get(id=pk) # Here you trying to get category
subcategories = SubCategory.objects.filter(category=categories)
return render(request, 'category.html', {
'categories': categories, # categories is single object not iterable
'subcategories': subcategories})
Pour la solution, vous pouvez soit définir categories = Category.objects.filter (id = pk) sur votre vues.py ou mettre à jour votre modèle html .
parce que mon erreur était liée à l'ensemble de requêtes. Qu'est-ce que ça veut dire ? un tableau. et chaque tableau a ses index, donc, dans cet exemple, notre 'categories' est un tableau et nous devons assigner son premier ([0]) index à une catégorie:
def category(request, pk):
categories = Category.objects.get(id=pk)
subcategories = SubCategory.objects.filter(category=categories[0])
return render(request, 'category.html', {'categories': categories, 'subcategories': subcategories})
Veuillez envisager d'ajouter une description de votre code afin que nous sachions ce qu'il fait et pourquoi.
sans rapport, mais vous pouvez utiliser
category.subcategory_set.all ()au lieu de filtrer manuellement.