为了账号安全,请及时绑定邮箱和手机立即绑定

上下文“Order.Items”未出现在 Django Admin 的 PDF 文件中

上下文“Order.Items”未出现在 Django Admin 的 PDF 文件中

PHP
小唯快跑啊 2023-11-09 16:53:01
你好,我正在尝试向我的管理员添加一项功能,可以从 PDF 文件下载订单详细信息,到目前为止,除了 Order.Model 未完全显示外,该功能已成功。所以我有 3 个模型:Item、OrderItem和Order。与Order具有多对多关系,OrderItem并且OrderItem与 具有外键Item。在模板中,我尝试在Order.Itemswhich is之间循环items = models.ManyToManyField(OrderItem),但它没有呈现任何数据。这是 models.pyclass Item(models.Model):    title = models.CharField(max_length=100)    price = models.FloatField()class OrderItem(models.Model):    user = models.ForeignKey(settings.AUTH_USER_MODEL,                             on_delete=models.CASCADE)    ordered = models.BooleanField(default=False)    item = models.ForeignKey(Item, on_delete=models.CASCADE)    quantity = models.IntegerField(default=1)    variation = models.ManyToManyField(Variation)class Order(models.Model):    items = models.ManyToManyField(OrderItem)这是views.py@staff_member_requireddef admin_order_pdf(request, order_id):    order = get_object_or_404(Order, id=order_id)    html = render_to_string('pdf.html', {'order': order})    response = HttpResponse(content_type='application/pdf')    response['Content-Disposition'] = 'filename="order_{}.pdf"'.format(Order.id)    weasyprint.HTML(string=html).write_pdf(response)    return response这是 url.py    path('admin/order/(<order_id>\d+)/pdf/', views.admin_order_pdf, name='admin_order_pdf')这是 pdf.html 模板,仅显示为突出显示                    Ordered on: {{order.ordered_date}}  <----------Showing                                        {% for order_item in order.items.all %}                    {{ order_item.item.title }}         <----------Not Showing                    {% endfor %}我什至尝试删除 forloop 但仍然没有发生                    Ordered on: {{order.ordered_date}}  <----------Showing                                        {{ order_item.item.title }}         <----------Not Showing
查看完整描述

3 回答

?
万千封印

TA贡献1891条经验 获得超3个赞

您正在将 Manytomany 字段与 一起使用OrderItem。因此,为了达到OrderItem,您将必须通过through在后台创建的模型。您through在编写时访问的是模式order.items.all()而不是OrderItem模型。

Order假设您的意图是在和模型之间创建多对多关系Item。那么您应该如何创建您的ManyToMany

class Item(models.Model):

    title = models.CharField(max_length=100)

    price = models.FloatField()


class OrderItem(models.Model):

    user = models.ForeignKey(settings.AUTH_USER_MODEL, 

                                on_delete=models.CASCADE)

    ordered = models.BooleanField(default=False)

    item = models.ForeignKey(Item, on_delete=models.CASCADE)

    quantity = models.IntegerField(default=1)

    variation = models.ManyToManyField(Variation)


class Order(models.Model):

    items = models.ManyToManyField(Item, through='OrderItem')

这将解决您的问题。


查看完整回答
反对 回复 2023-11-09
?
ibeautiful

TA贡献1993条经验 获得超5个赞

我想我没有足够的信息来回答,但从我在这里看到的,您只是从视图(单个订单)传递一个订单,而不是查询集或任何其他可迭代到模板。我错过了查询集或可迭代吗?

如果您想访问与订单相关的其他对象(例如 OrderItem),则您在模板中缺少它。从您的模型中我可以看到 Order 与 OrderItem 有关系,而不是 Items。项目是您尝试在视图中访问的项目。(你有 Items 模型吗?)

删除循环不起作用,因为模板中没有可用的 order_item 变量。


查看完整回答
反对 回复 2023-11-09
?
30秒到达战场

TA贡献1828条经验 获得超6个赞

{{order.ordered_date}}这是无效的。根据您在此处显示的内容,您的Order模型没有任何字段或方法。ordered_date


Ordered on: {{order.ordered_date}}  # This is wrong and invalid

                    

{% for order_item in order.items.all %}

    {{ order_item.item.title }} # This is valid, use this method to render other fields

{% endfor %}

当你转换上面的html代码时,它会生成这样的pdf。item_1这是项目的标题。{{order.ordered_date}}没有工作而是{{ order_item.item.title }}工作并且它被渲染在pdf中。

https://img1.sycdn.imooc.com/654c9e220001767603460188.jpg

您共享的第二个片段无效,不会显示任何动态数据。它只会渲染Ordered on:

Ordered on: {{order.ordered_date}}  <----------Invalid
                
{{ order_item.item.title }}         <----------Invalid

我希望这能解决您的疑问。


查看完整回答
反对 回复 2023-11-09
  • 3 回答
  • 0 关注
  • 89 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信