2
votes

Pourquoi Django renvoie-t-il une erreur Django object is not iterable?

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)


1 commentaires

sans rapport, mais vous pouvez utiliser category.subcategory_set.all () au lieu de filtrer manuellement.


3 Réponses :


2
votes

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!


1 commentaires

Juste {{categories.name}} sans boucle, pour commencer. Mais vous devriez vraiment changer le nom de cette variable de contexte en un nom singulier.



0
votes

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 .


0 commentaires

0
votes

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})


1 commentaires

Veuillez envisager d'ajouter une description de votre code afin que nous sachions ce qu'il fait et pourquoi.