Обновление Django с версии 1.9 до версии 2.0

в 12:22, , рубрики: django, django2.0, python, обновление

Здравствуйте, сегодня я хотел бы вам рассказать о том, как обновить проект с версии 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, а так же избежать лишней потери времени на разбор и поиск решений типичных ошибок.

Автор: Дмитрий Анисов

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js