【问题标题】:How display on an HTML a list of objects (ManyToMany) that is a class attribute如何在 HTML 上显示作为类属性的对象列表 (ManyToMany)
【发布时间】:2020-05-02 03:44:25
【问题描述】:

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

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

正如我所说,我只是在学习 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 变量返回 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 访问,或者通过在上下文中传递变量在视图中访问

总而言之,我想在 Order id 旁边看到:“数字”,例如“Pizza 9.99, Coca Cola 3.5”。

【问题讨论】:

    标签: django django-templates django-views django-queryset


    【解决方案1】:
    <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()
    

    【讨论】:

    • 感谢您的回答。我已经尝试过您的解决方案,但它返回“ManyRelatedManager”对象不可迭代错误
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-09
    • 2021-10-12
    • 1970-01-01
    • 2011-01-23
    • 2015-02-12
    • 2013-07-09
    • 2021-02-20
    相关资源
    最近更新 更多