使用重定向覆盖FBC到CBV的最佳方法来纠正slu ..

时间:2015-07-30 14:18:11

标签: python django django-views

我有一个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。在这种情况下,FBVCBV短。也许CBV中有其他解决方案吗?

1 个答案:

答案 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()