在 Django 基于类的视图中返回多个值

问题描述 投票:0回答:1

我正在为我正在学习的 Django 课程开发一个项目,但目前在视图方面遇到了一些困难。

在项目中,我使用 ListView 创建了一个视图来显示模板中的产品列表。通过使用 query_set,我可以获取所有对象并返回它们,以使用 for 循环在模板中显示所有产品及其属性。

在同一个查询集中,我尝试返回另一个包含库存总数的变量,以在模板中显示此数据,但是,一旦我将此变量添加到返回值中,模板就不再接收返回值。

这是我尝试返回两个值的代码:

class ShopListing(ListView):
    template_name = "webshop/shop_listing.html"
    context_object_name = 'shop_listing'

    def get_queryset(self):
        #Get all products
        products = Product.objects.all()
        total_stock = products.aggregate(sum=Sum('stock'))['sum']
        return products, total_stock

在我的模板中,我添加了值“total_stock”,如下所示,但我什么也没得到,甚至“产品”中的值也停止工作:

<p><strong>{{total_stock}}</strong> items are currently available</p>

如果我从退货中删除“total_stock”,一切都会恢复正常。

如果我打印“total_stock”,我可以在日志中看到正确的值,但这不能在我的模板中使用,所以我想知道执行此操作的正确方法是什么。

将不胜感激任何指导。

python django django-views django-templates
1个回答
0
投票

我怀疑这是因为背后的机制

get_queryset()
。通过返回附加值,您实际上将
tuple
返回到内部调用
get_queryset()
的视图类方法。您可以查看
ListView
及其相关类的 Django 源代码,了解它们在幕后使用模型和模板上下文变量。

但是,根据您的描述,我认为您想扩展

get_context_data()
方法:

class ShopListing(ListView):
    template_name = "webshop/shop_listing.html"
    context_object_name = 'shop_listing'
    queryset = Product.objects.all()

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['total_stock'] = Product.objects.aggregate(sum=Sum('stock'))['sum']
        return context

'total_stock'
应可用作模板变量,以及预期的
QuerySet

© www.soinside.com 2019 - 2024. All rights reserved.