我正在尝试返回商家的类别列表,对于每个类别,我想列出与该类别相关的所有商品。
我退回了所有项目,而不是按类别,但我已经决定要按类别排序。这是我尝试过的(以及其他尝试)我只是在将项目放入类别时遇到问题。这是我最近的尝试
在我的models.py中我有
Business(models.Model):
name = models.CharField(max_length=100)
address = models.CharField(max_length=100)
logo = models.CharField(max_length=300)
ItemCategory(models.Model):
name = models.CharField(max_length=50)
Item(models.Model):
name = models.CharField(max_length=100)
business = models.ForeignKey(Business)
category = models.ForeignKey(ItemCategory)
short_description = models.CharField(max_length=250)
在我的views.py
中def business_profile(request, business_id):
items = Item.objects.filter(business_id = business_id).select_related('itemcategory')
return render(request, 'business_profile.html', {"items": items})
在我的模板中我正在尝试
{% for itemcategory in items.itemcategory_set.all %}
{{ itemcategory.name }}
{% for item in itemcategory %}
{{ item.name }} <br>
{{ item.short_description }}
{% endfor %}
{% endfor %}
从我对其他问题的研究和阅读文档,我觉得这是正确的..但是从我的结果来看,我无法在模板中得到正确的输出。
categories = ItemCategory.objects.filter(business = business_id)
然后可能添加一个select_related('item')来处理该类别的所有项目?
更新:我在评论中作了解释并在下面回答。
答案 0 :(得分:0)
items = Item.objects.filter(business_id = business_id)
错了。
你应该说:
items = Item.objects.filter(business__id = business_id)#Notice双下划线。
你也可能更喜欢这项业务并简单地说:
business.item_set.all() #This would retrieve all Item for the business.
select_related()
期望将字段名称作为参数。因此,请使用Item模型上存在的字段名称。像:
select_related('category')
这顿饭在哪里?也许你可以从那里继续。
答案 1 :(得分:0)
为了按类别列出项目,我使用了@ yusuf.oguntola的想法并且最初使用.get()获得了业务,然后我创建了一个查询集来获取所有项目。我在views.py中的功能包括
business = Business.objects.get(id = business_id)
items = business.item_set.all().order_by('category')
注意:business_id是以url模式传递的
然而,关键的变化是在我的模板中。我在django文档here
中找到了这个很棒的内置模板功能我在模板中实现了它......
{% regroup items by category as category_list %}
<ul>
{% for category in category_list %}
<li>{{ category.grouper }}
<ul>
{% for item in category.list %}
<li>{{ item.name }}<br> {{ item.short_description }}</li>
{% endfor %}
</ul>
</li>
{% endfor %}
</ul>
最重要的部分之一是你必须拥有order_by()并输入你所订购的字段的参数 - 在我的例子中,类别。如果不包含此项,则只会按时间顺序列出项目,并重复您的字段实例。