如何在 HTML 上显示属于 class 属性的对象列表 (ManyToMany)

How display on an HTML a list of objects (ManyToMany) that is a class attribute

我是 Django 初学者,所以我希望我的问题是有道理的。

我正在尝试了解购物车应用程序工作原理的基础知识。不涉及会话。另外,我想在主页上显示所有内容,以便订单 'summary' 始终在一页上可见和更新。

正如我所说,我刚开始学习 Django,所以我创建了两个模型,Item 和 Cart

'models.py'

from django.db import models
from django.contrib.auth.models import User


# Create your models here.
class Item(models.Model):
    name = models.CharField(max_length=25)
    price = models.DecimalField(max_digits=5, decimal_places=2)

    def __str__(self):
        return self.name


class Cart(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    created_at = models.DateTimeField(auto_now_add=True)
    items = models.ManyToManyField(Item)
    total = models.DecimalField(max_digits=5, decimal_places=2)

    def __str__(self):
        return 'Order number: %s' % self.id

'views.py'

中的主页视图
from django.shortcuts import render
from .models import Cart, Item


# Create your views here.
def home(request):
    items = Item.objects.all()
    carts = Cart.objects.all()
    length = len(Cart.objects.all())
    cart = carts[length - 1]
    cart_items = cart.items
    return render(request, 'cart/home.html', {'cart': cart,
                                              'items': items,
                                              'cart_items': cart_items})

映射在'urls.py'中(包含在主'urls.py'中)

from django.urls import path
from . import views

urlpatterns = [
    path('', views.home, name='home')
]

我已经在管理员中注册了这两个模型,尽管我知道购物车不应该,但是为了测试,我创建了一些项目和一些订单。

现在在我的模板上,我已经成功地显示了菜单中可用的项目、当前的以及最后的订单 ID,但我无法访问购物车中的项目。

正如您从我的基本模板中看到的,我在视图中定义并在上下文中传递的 cart_items 变量 return cart.Item.None,尽管它实际上包含 3 个项目。

这是 HTML:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Home page</title>
</head>
<body>
<div><h1>Menu</h1></div>
{% for item in items %}
<ul>{{ item }}</ul>
{% endfor %}
<div><h1>Order</h1></div>
{{ cart }}
{{ cart_items }}
</body>
</html>

我不知道是否必须通过 Django 模板语言从 HTML 访问,或者在视图中通过在上下文中传递变量来访问

总而言之,我想在订单 ID 旁边看到:'the number',类似于 'Pizza 9.99, Coca Cola 3.5'。

<div><h1>Order</h1></div>
<div>{{ cart }}</div>
{% for item in cart_items %}
    <ul>{{ item.name }} {{ item.price }}</ul>
{% endfor %}

更新:

你也需要重塑你的观点

cart_items = cart.items.all()