猿问

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

你好,


我正在尝试向我的管理员添加一项功能,可以从 PDF 文件下载订单详细信息,到目前为止,除了 Order.Model 未完全显示外,该功能已成功。


所以我有 3 个模型:Item、OrderItem和Order。与Order具有多对多关系,OrderItem并且OrderItem与 具有外键Item。


在模板中,我尝试在Order.Itemswhich is之间循环items = models.ManyToManyField(OrderItem),但它没有呈现任何数据。


这是 models.py


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(OrderItem)

这是views.py


@staff_member_required

def 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


小唯快跑啊
浏览 154回答 3
3回答

万千封印

您正在将 Manytomany 字段与 一起使用OrderItem。因此,为了达到OrderItem,您将必须通过through在后台创建的模型。您through在编写时访问的是模式order.items.all()而不是OrderItem模型。Order假设您的意图是在和模型之间创建多对多关系Item。那么您应该如何创建您的ManyToManyclass 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')这将解决您的问题。

ibeautiful

我想我没有足够的信息来回答,但从我在这里看到的,您只是从视图(单个订单)传递一个订单,而不是查询集或任何其他可迭代到模板。我错过了查询集或可迭代吗?如果您想访问与订单相关的其他对象(例如 OrderItem),则您在模板中缺少它。从您的模型中我可以看到 Order 与 OrderItem 有关系,而不是 Items。项目是您尝试在视图中访问的项目。(你有 Items 模型吗?)删除循环不起作用,因为模板中没有可用的 order_item 变量。

30秒到达战场

{{order.ordered_date}}这是无效的。根据您在此处显示的内容,您的Order模型没有任何字段或方法。ordered_dateOrdered on: {{order.ordered_date}}&nbsp; # This is wrong and invalid&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;{% for order_item in order.items.all %}&nbsp; &nbsp; {{ 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中。您共享的第二个片段无效,不会显示任何动态数据。它只会渲染Ordered on:Ordered&nbsp;on:&nbsp;{{order.ordered_date}}&nbsp;&nbsp;<----------Invalid &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {{&nbsp;order_item.item.title&nbsp;}}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<----------Invalid我希望这能解决您的疑问。
随时随地看视频慕课网APP
我要回答