#python #django #django-views
#python #django #django-views
Вопрос:
В моем проекте используются представления на основе классов, но я не могу создать пользовательскую страницу ошибок 500, используя этот подход.
Использование представления на основе классов:
client_interface/views/errors/server_error_view.py
:
from django.shortcuts import render
from django.views import View
class ServerErrorView(View):
def get(request):
return render(request, "client_interface/errors/500.html")
urls.py
:
from client_interface.views.errors.server_error_view import ServerErrorView
handler500 = ServerErrorView.as_view()
Он всегда возвращает ?: (urls.E007) The custom handler500 view 'client_interface.views.errors.server_error_view.ServerErrorView' does not take the correct number of arguments (request).
, что я пытался изменить аргументы get
метода на (self, request)
, или (*args)
, но ошибка остается прежней.
С другой стороны, если я использую представление на основе функций:
client_interface/views/errors/server_error_view
:
from django.shortcuts import render
def custom_error_view(request):
return render(request, "client_interface/errors/500.html", {})
urls.py
handler500 = 'client_interface.views.errors.server_error_view.custom_error_view'
Все работает нормально.
Итак, теперь мне интересно, допустимо ли иметь одно представление на основе функций, а остальная часть приложения будет основана на классах, или это преступление в мире django.
Ответ №1:
Django имеет встроенное представление ошибок 500
При необходимости вы можете создать 500.html
шаблон в своем корневом каталоге шаблонов. По сути, вам не нужно создавать представление для этого.
Отвечая на ваш вопрос: если вы знаете, что делаете, наличие представлений на основе классов и функций — это нормально. Просто четко изложите свои идеи, чтобы другие разработчики или вы сами позже могли понять эту идею и с легкостью поддерживать ваш код.
Ответ №2:
В вашем get
методе класса отсутствует параметр для экземпляра класса, поэтому:
class ServerErrorView(View):
def get(self, request):
return render(request, "client_interface/errors/500.html")
Лучшей практикой django было бы определить метод GET как get(self, request, *args, **kwargs)
.
Комментарии:
1. К сожалению, бот
get(self, request)
иget(self, request, *args, **kwargs)
по-прежнему выдает ту же ошибку:The custom handler500 view 'client_interface.views.errors.server_error_view.ServerErrorView' does not take the correct number of arguments (request).