Как проверить состояние объекта, прежде чем показывать в django CBV - PullRequest
1 голос
/ 12 апреля 2019

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

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

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 Ответ

2 голосов
/ 12 апреля 2019

Очень просто отобразить страницу 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() дважды или излишне отобразите шаблон перед перенаправлением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...