Рендер шаблона внутри def get_object вместо того, чтобы поднимать raise Http404("Не существует") в представлении на основе класса
В методе get_object класса views можно ли направить пользователя на шаблон вместо возврата объекта, если оператор 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"})
Моя основная цель - просто избежать получения объекта. Я знаю, что могу выполнить оператор if в методе get_context_data, однако я не был уверен, что для объектов, содержащих конфиденциальные данные, будет ли у пользователя какой-либо способ получить к ним доступ, как только они окажутся в 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, чтобы показать ваш пользовательский шаблон (вы можете сохранить ваш фактический код).