首页 > 解决方案 > 使用 super() 在基于类的视图中覆盖 get 方法

问题描述

我创建了一个视图来管理属于当前登录用户的产品(因此当前用户可以观看自己的产品):

class ProductList(View):
  def get(self, request, *args, **kwargs):
    products = Product.objects.get(user=self.request.user)
    #...

我想从中继承另一个视图,它管理属于在 url 中指定为 GET 参数的用户的产品(可能与当前用户不同)。是否可以使用 super() 并覆盖 product_list 中的方法?像这样的东西:

class ProductListFromUser(ProductList):
   def get(self, request, *args, **kwargs):
     #not sure what code if necessary to put here...
     super().get(self, request, *args, **kwargs): 
     #or here
#...

基本上,我如何覆盖 product_list 的 get 方法,仅通过从 URL 获取的参数更改“self.request.user”

标签: pythondjangodjango-class-based-viewsoverriding

解决方案


你不应该做这些。

如果您有一个呈现项目列表的视图,则应使用 ListView 的子类。在该视图中,您可以在get_queryset方法中定义产品列表,您可以在两个不同的视图中以相关方式定义它。

class ProductList(ListView):
  def get_queryset(self, *args, **kwargs):
    return Product.objects.filter(user=self.request.user)

class ProductListFromUser(ListView):
  def get_queryset(self, *args, **kwargs):
    return Product.objects.filter(user__username=self.request.GET['user'])

您应该很少需要直接在基于类的视图中定义get(或)。post


推荐阅读