Как проверить состояние объекта перед отображением в django CBVs

#python #django

#python #django

Вопрос:

Я хочу проверить статус объектов в представлениях. Если это правда, ничего не меняется, но если статус неверный, я хочу перенаправить пользователей на другую страницу.

Вот мои взгляды:

 class ProductDetailView(LoginRequiredMixin, MultiSlugMixin, DetailView):
    model = Product

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        product_name = self.object.title
        category_commission = self.object.category.commission
        data = Stocks.objects.filter(product__title__icontains=product_name).order_by('price')
        context['category_commission'] = category_commission
        context['stocks'] = data

        return context
  

И у меня есть поле статуса в модели продукта, подобное этому:

 status = models.BooleanField(default=False)
  

Я хочу добиться чего-то подобного:

 if self.object.status:
    do sth
else:
    redirect('productlistpage')
  

Ответ №1:

Очень легко отобразить страницу 404, когда статус отсутствует True , просто переопределите get_queryset.

 def get_queryset(self):
    return = super(ProductDetailView, self).get_queryset().filter(status=True)
  

Однако это не совсем то поведение, о котором вы просили. Если вы хотите перенаправить, вам придется переопределить get или dispatch , например:

 class ProductDetailView(LoginRequiredMixin, MultiSlugMixin, DetailView):
    ...
    def get(self, request, *args, **kwargs):
        self.object = self.get_object()
        if not self.object.status:
            return redirect('productlistpage')
        context = self.get_context_data(object=self.object)
        return self.render_to_response(context)
  

Это не идеально, потому что вы дублируете код из BaseDetailView.get() метода, но это делает поток кода понятным. Вы могли бы вызвать super() свой get() метод, но тогда вам пришлось бы get_object() дважды вызывать или излишне отображать шаблон перед перенаправлением.