Является ли смешивание представлений на основе классов и функций в Djago приемлемой практикой?

#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).