我正在为我正在学习的 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”,我可以在日志中看到正确的值,但这不能在我的模板中使用,所以我想知道执行此操作的正确方法是什么。
将不胜感激任何指导。
我怀疑这是因为背后的机制
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
。