Здравствуйте, сегодня я хотел бы вам рассказать о том, как обновить проект с версии 1.9 до 2.0. Какие основные нюансы нужно учесть и переписать, дабы проект стартовал на новой версии Django.
Первый шаг.
Это обновление Django до версии 2.0, а также обновление всех сопутствующих ваших пакетов, которые используются в проекте, т.к. я использую виртуальное окружение и requirements.txt, то для меня это один способ, для вас может быть другой.
После того как вы обновили все пакеты, не стоит запускать проект, он всё равно не запустится, поэтому сразу приступим к исправлению всех основных моментов, дабы проект стартанул.
Второй шаг. Обновление всех urls.py вашего проекта.
В главном вашем urls.py, в котором вы инклюдите урлы из других апликейшинов, подключаем:
from django.urls import re_path, path
И меняем c url на path, а так же убираем регулярные выражения в данных подключениях.
url(r'^ some/', include('some.urls')), # старый вариант
path('some/', include('some.urls')),
Если у вас используются вьюхи непосредственно из данного апликейшина, которые требует регулярок, то используем:
re_path(r'^app/$', App.as_view(), name='app')
В подключаемых апликейшинах(например some/urls.py), в файле urls.py, используем:
re_path(r'^create/$', Create.as_view(), name='create')
Если вы используете namespace в урлах при инклуде, то удаляем их оттуда и переносим их непосредственно в подключаемое приложение. Переходим в urls.py данного приложения и прописываем сверху над urlpatterns =[]
app_name = ‘app-application’
Данная строчка выступает заменой namespace и призвана сделать главный urls.py более чистым и читаемым, а также для удобства изменения имён в одном месте.
Третий шаг.
Используем поиск по всему проекту, в зависимости от вашего редактора кода, который вы используете при разработке, это могут быть разные хот кеи, думаю вы их знаете, поэтому останавливаться тут не буду.
Вбиваем:
is_authenticate()
И меняем на
is_authenticate
. Теперь это не метод, а свойство. Эта ошибка будет вызывать исключение.
Далее в проекте ищем:
from django.core.urlresolvers import reverse
И меняем на:
from django.urls import reverse
Четвёртый шаг.
Теперь во всех models.ForeignKey, должен быть обязательный позиционны аргумент “on_delete” например:
on_delete=models.CASCADE
on_delete=models.DO_NOTHING
on_delete=models.SET_NULL
Далее делаем:
python manage.py makemigrations
python manage.py migrate
Пятый шаг.
Если вы попытаетесь запустить проект, то он уже должен запуститься, но сразу он вам выдаст ошибку, как только вы зайдёте на 127.0.0.1:8000.
Ошибка будет следующая:
AttributeError at /
‘WSGIRequest’ object has no attribute ‘user’
Она происходит из-за того, что нужно переименовать MIDDLEWARE_CLASSES на MIDDLEWARE
Далее вы получите следующую ошибку в консоли:
django.core.exceptions.ImproperlyConfigured: WSGI application 'application' could not be loaded; Error importing module: 'application doesn't look like a module path
Эта ошибка происходит из-за того что у вас старые middleware, и вы должны их обновить на:
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'django.middleware.security.SecurityMiddleware'
Шестой шаг.
Если вы используете собственные middleware в проекте, то они должны наследоваться от MiddlewareMixin, а не от object (можно и через object, но тогда нужно прописывать дополнительные обязательные методы)
Импорт:
from django.utils.deprecation import MiddlewareMixin
На этом всё! :)
Конечно, если у вас очень большой проект и вы используете большое количество пакетов, то проблем у вас будет больше, но уже цепочка ошибок в консоли вам поможет их решить и запустить проект в должном режиме. В данном гайде описаны основные ошибки и способы их решения, которые актуальны для всех проектов с Django 1.9 (некоторые моменты не актуальны для версии Django 1.11), и помогут быстрее перенести проект на Django 2.0, а так же избежать лишней потери времени на разбор и поиск решений типичных ошибок.
Автор: Дмитрий Анисов