在 def get_object 中呈现模板而不是 raise raise Http404

Render a template within def get_object instead of raise raise Http404

在 class 视图的 get_object 方法中,如果 if 语句失败,我可以将用户定向到模板而不是返回对象吗?

目前 raise Http404("Some message.") 效果很好但看起来不太好,我想使用我自己的模板。

我正在尝试这样做,但使用模板:

def get_object(self):
    product = Product.objects.get(slug=self.kwargs.get('slug'))
    
        if product.deleted == False:
            if product.out_of_stock == False:
                return product
            else:
                raise Http404("This product is sold out.")
                # return reverse("404-error", kwargs={"error": "sold-out"})
                # return render(request, "custom_404.html", {"error": "sold_out"})
                                
        else:
            raise Http404("This product is no longer available.")
            # return reverse("404-error", kwargs={"error": "deleted"})
            # return render(request, "custom_404.html", {"error": "deleted"})

我的主要目标是避免得到对象。我知道我可以在 get_context_data 方法中执行 if 语句,但是我不确定包含敏感数据的对象一旦在 get_object 中,用户是否可以通过任何方式访问它,所以我只是想避免在条件失败时完全获取对象并向用户显示模板。

出现404错误时可以使用自己的视图,先创建自定义视图:

观看次数

from django.shortcuts import render

def handler404(request, *args, **kwargs):
    return render(request, template_name='custom_404.html', status=404)

现在您需要覆盖默认的 404 视图,将其添加到您的 urls.py 主文件中:

urls.py

handler404 = 'appname.views.handler404'  # Replaces  appname with the name of the app that contains the custom view

现在您可以简单地引发一个 Http404 异常来显示您的自定义模板(您可以保留您的实际代码)。