繁体   English   中英

Django 查询列表到模板 - 按类别显示项目

[英]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': {}}] 

模型.py

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)


视图.py


    restaurant = Owner.objects.get(id=owner_id)

    return render(
        request,
        "detail_page.html",
        {
            "restaurant": owner,
        },
    )

detail_page.html

{% 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM