Шаблон Django, не выполняющий итерацию по объекту

#python #django

#python #django

Вопрос:

Я использую Django для отображения меню элементов. Я могу получить желаемый контент просто отлично, но когда я возвращаю его в шаблон django, это просто строка json, поэтому она не будет повторяться правильно. Как мне сказать django вернуть его как итерируемый объект?

Я наткнулся на эту статью. Может быть, я хочу объединить наборы запросов?

Python

 def index(request):
    if not request.user.is_authenticated:
        return redirect('/login', {'message': None})
    try:
        menu_categories = MenuCategory.objects.all()
        menu = []
        for cat in menu_categories:
            items = MenuCategoryItems.objects.filter(category_id=cat.id).all()
            menu.append({'category': cat, 'items': items})
        context = {'menu': menu}
        # for cat in menu_categories:
        #     items = menu_items.filter(category_id=cat.id)
        #     category_items = []
        #     for item in items:
        #         category_items.append({
        #             "name": item.name,
        #             "price": float(item.price),
        #             "id": item.id
        #         })
        #     menu.append({"category": cat.name, "items": category_items})

    except Exception:
        print('failure')

    return render(request, 'index.html', context)
  

Шаблон

             {% for category in menu %}
                <div>{{ category.name }}</div>
{#                {% for item in category.items %}#}
{#                    <div>{{ item.name }} | {{ item.price }}</div>#}
{#                {% endfor %}#}
            {% endfor %}
  

Ответ №1:

Я думаю, что нашел свой ответ. Это сработало для меня, но я не уверен, является ли это «предпочтительным» способом.

Python

 def index(request):
    if not request.user.is_authenticated:
        return redirect('/login', {'message': None})
    try:
        menu_categories = MenuCategory.objects.all()
        menu = []
        for cat in menu_categories:
            items = MenuCategoryItems.objects.filter(category_id=cat.id).all()
            menu.append({'category': cat, 'items': items.values})
        context = {'menu': menu}
    except Exception:
        print('failure')

    return render(request, 'index.html', context)
  

Шаблон

     {% for category in menu %}
        <div><strong>{{ category.category.name }}</strong></div>
        {% for item in category.items %}
            <div>{{ item.name }} - {{ item.price }}</div>
        {% endfor %}
    {% endfor %}