我有一个FB视图,显示当前品牌的所有产品:
def brand_products(request, brand_id, slug):
brand = get_object_or_404(Brand, id=brand_id)
if slug != brand.name_for_url:
return redirect(brand)
products = brand.product_set.all()
return render(request, 'products.html',
{'products': products})
我想把它改写成CBV,这是我得到的:
class ProductListView(ListView):
model = Brand
context_object_name = 'products'
template_name = 'products.html'
context_object_name = 'products'
def get(self, request, *args, **kwargs):
self.brand = get_object_or_404(Brand, id=self.kwargs['pk'])
if self.kwargs['brand_slug'] != self.brand.name_for_url:
return redirect(self.brand)
else:
products = self.brand.product_set.all()
return render(request, self.template_name, {'products':products})
我无法在get_queryset
方法中设置查询集,但我无法使用正确的网址将页面重定向到同一页面。我通过primarykey获取对象,但如果slug
不正确,那么我将使用正确的slug(name_for_url
)将页面重定向到正确的url。在这种情况下,FBV
比CBV
短。也许CBV
中有其他解决方案吗?
答案 0 :(得分:0)
首先,如果基于函数的视图有效,则无需通过转换为基于类的视图获得任何内容。
如果你真的想要一个CBV,那么我会在get
方法中做得更少。获取brand
,必要时重定向,否则请拨打super()
def get(self, request, *args, **kwargs):
self.brand = get_object_or_404(Brand, id=self.kwargs['pk'])
if self.kwargs['brand_slug'] != self.brand.name_for_url:
return redirect(self.brand)
else:
return super(ProductListView, self).get(request, *args, **kwargs)
然后,您可以使用self.brand
方法访问get_queryset
。
def get_queryset(self):
return self.brand.product_set.all()