使用 super() 在基于 class 的视图中覆盖 get 方法
Overriding get method in class based view with super()
我创建了一个视图来管理属于当前登录用户的产品(因此当前用户可以查看自己的产品):
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"
如果您使用 get_queryset 方法检索给定请求的查询集,即 DetailView 使用的 CBV,那么您可以简单地覆盖父级的 get_queryset-class .
你不应该做这些。
如果您有一个呈现项目列表的视图,您应该使用 ListView 的子class。在该视图中,您可以在 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'])
您应该很少需要直接在基于 class 的视图中定义 get
(或 post
)。
我会将适当的 QuerySet 的检索移动到一个额外的方法,您可以覆盖该方法以尽可能多地重用初始代码:
class ProductList(View):
def get_products(self):
return Product.objects.all()
def get(self, request, *args, **kwargs):
products = self.get_products()
# ...
class ProductList(View):
def get_products(self):
qs = super().get_products()
qs = qs.filter(user=self.request.user)
return qs
# no get needed
这个功能是 django 的 ListView
及其 get_queryset
方法。
我创建了一个视图来管理属于当前登录用户的产品(因此当前用户可以查看自己的产品):
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"如果您使用 get_queryset 方法检索给定请求的查询集,即 DetailView 使用的 CBV,那么您可以简单地覆盖父级的 get_queryset-class .
你不应该做这些。
如果您有一个呈现项目列表的视图,您应该使用 ListView 的子class。在该视图中,您可以在 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'])
您应该很少需要直接在基于 class 的视图中定义 get
(或 post
)。
我会将适当的 QuerySet 的检索移动到一个额外的方法,您可以覆盖该方法以尽可能多地重用初始代码:
class ProductList(View):
def get_products(self):
return Product.objects.all()
def get(self, request, *args, **kwargs):
products = self.get_products()
# ...
class ProductList(View):
def get_products(self):
qs = super().get_products()
qs = qs.filter(user=self.request.user)
return qs
# no get needed
这个功能是 django 的 ListView
及其 get_queryset
方法。