[英]Django query list to template - display items by category
我正在尝试创建一个数组以传递给模板页面,该页面应根据其类别对我的项目进行分组。
我不知道如何使用 Django 中的单个查询来做到这一点,所以我想定义一个 function 应该得到类似于我想显示的结果的数组
Title: Category_A
|
|_Menu_item_1_in_cat_A
|_option_1_of_menu_item_1
|_option_2_of_menu_item_1
|_extra_1_of_menu_item_1
|
|_Menu_item_2_in_cat_A
|_option_1_of_menu_item_2
Title: Category_B
|
|_Menu_item_3_in_cat_B
|_option_1_of_menu_item_3
|_option_2_of_menu_item_3
|_extra_1_of_menu_item_3
我的 function 不工作......这是结果,但有项目要显示......
[{'category': 'Category A', 'items': {}, 'options': {}, 'extras': {}}, {'category': 'Category B', 'items': {}, 'options': {}, 'extras': {}}]
class Owner
...
def get_menu_list(self):
menu_list = []
# defining the categories
categories = (
Menu.objects.filter(owner=self.id)
.order_by("category")
.values("category")
.distinct()
)
for category in categories:
# create main group
details = {}
details["category"] = category["category"]
# select the items present in the category
items_list = []
options_list = []
extras_list = []
for item in Menu.objects.filter(owner=self.id, category=category)
items_list.append(item)
# add options and extra to the category
for item in MenuOptionItem.objects.get(menu=item.id)):
options_list.append(option)
for extra in MenuExtraItem.objects.get(menu=item.id)):
extras_list.append(extra)
details["items"] = items_list
details["options"] = options_list
details["extras"] = extrass_list
menu_list.append(details)
return menu_list
class Menu(models.Model):
owner = models.ForeignKey(User, on_delete=models.CASCADE)
menu_title = models.CharField(max_length=500, blank=False)
short_description = models.CharField(max_length=500, blank=False)
image = models.ImageField(upload_to="menu_images/", blank=False)
price = models.DecimalField(max_digits=14, decimal_places=2, default=0)
category = models.CharField(max_length=500, blank=True)
class MenuOptionItem(models.Model):
menu = models.ForeignKey(Menu, on_delete=models.CASCADE)
price = models.DecimalField(max_digits=14, decimal_places=2, blank=True)
desc = models.CharField(max_length=100, blank=True)
class MenuExtraItem(models.Model):
menu = models.ForeignKey(Menu, on_delete=models.CASCADE)
price = models.DecimalField(max_digits=14, decimal_places=2, blank=True)
desc = models.CharField(max_length=100, blank=True)
restaurant = Owner.objects.get(id=owner_id)
return render(
request,
"detail_page.html",
{
"restaurant": owner,
},
)
{% for category, items in restaurant.get_menu_list %}
...
{% for item in items %}
{{ item.name }}
{% for option in item.options %}
{{ option.name }}
{% endfor %}
{% for extra in item.extras %}
{{ extra.name }}
{% endfor %}
...
{% endfor %}
...
{% endfor %}
感谢您的任何帮助!
老实说,我不喜欢你构建字典的方式。 如果您可以像这样构建它...
那么这将起作用
def getSubs(self, item):
return {
"options", MenuOptionItem.objects.get(menu=item.id),
"extra", MenuExtraItem.Objects.get(menu=item.id)
}
def getItem(self, category):
return {item: getSubs(item) for item in Menu.objects.filter(owner=self.id, category=category)}
def get_menu_list(self):
categories =Menu.objects.filter(owner=self.id).order_by("category").values("category").distinct()
return {category: getItems(category) for category in categories}
所以我发现我的 function 出了什么问题
# select the items present in the category
details["items"] = Menu.objects.filter(
restaurant=self.id, category=category["category"]
)
for item in Menu.objects.filter(
restaurant=self.id, category=category["category"]
):
details["options"] = MenuOptionItem.objects.filter(menu=item.id)
details["ingredients"] = MealExtraItem.objects.filter(menu=item.id)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.