首页 > 解决方案 > Django 基于类的视图返回视图或重定向到另一个页面

问题描述

我正在将我的函数重写为基于类的视图,这是我目前拥有的函数。

@login_required
def invoice(request, invoice_no, template_name="invoice.html"):
    context = {}
    invoice_exists = Invoice.objects.filter(invoice_no=invoice_no)
    if invoice_exists:
        context['invoice'] = invoice_exists.first()
    else:
        return HttpResponseRedirect(reverse('invoices'))

    return render(request, template_name, context)

您必须登录,它使用名为的过滤器进行过滤invoice_no

path('invoice/<int:invoice_no>', views.InvoiceView.as_view(), name="invoice"),

如果找到匹配项,则返回它,否则将您重定向回发票页面。

这就是我作为一个班级所拥有的

class InvoiceView(DetailView):
    queryset = Invoice.objects.all()
    context_object_name = 'invoice'
    pk_url_kwarg = 'invoice_no'
    template_name = "invoice.html"

    @method_decorator(login_required)
    def dispatch(self, *args, **kwargs):
        return super().dispatch(*args, **kwargs)

    def get_object(self):
        obj = super().get_object()
        return obj

获取对象或 404 也可以,因为它所需要的只是一个 404 页面,它会工作。

标签: django

解决方案


试试这个:

class ArticleDetailView(LoginRequiredMixin, DetailView):
    template_name = "invoice.html"
    context_object_name = 'invoice'
    model = Invoice

    def dispatch(self, request, *args, **kwargs):
        try:
            return super().dispatch(request, *args, **kwargs)
        except Invoice.DoesNotExist:
            return HttpResponseRedirect(reverse('invoices'))

    def get_object(self):
        return Invoice.objects.get(invoice_no=self.kwargs['invoice_no'])

推荐阅读