Olá, hoje eu gostaria de falar sobre como atualizar um projeto da versão 1.9 para a 2.0. Quais são as principais nuances a serem consideradas e reescritas para que o projeto inicie na nova versão do Django.
Primeiro passo
Esta é uma atualização do Django para a versão 2.0, bem como uma atualização de todos os pacotes relacionados que são usados no projeto, como Eu uso o ambiente virtual e requirements.txt, então para mim essa é uma maneira, para você pode ser diferente.
Depois de atualizar todos os pacotes, você não deve iniciar o projeto, ele não será iniciado de qualquer maneira; portanto, comece imediatamente a corrigir todos os pontos principais para que o projeto inicie.
Segundo passo. Atualizando todos os urls.py do seu projeto
Em seus principais urls.py, nos quais você inclui URLs de outros aplicativos, conectamos:
do django.urls import re_path, path.
E alteramos o URL para path, assim como removemos expressões regulares nessas conexões.
url(r'^ some/', include('some.urls')),
Se você estiver usando visualizações diretamente deste aplicativo, o que exige regulares, usamos:
re_path(r'^app/$', App.as_view(), name='app')
Nos aplicativos de plug-in (por exemplo, alguns / urls.py), no arquivo urls.py, usamos:
re_path(r'^create/$', Create.as_view(), name='create')
Se você usar espaço para nome em URLs durante a inclusão, exclua-os e transfira-os diretamente para o aplicativo conectado. Vamos para urls.py desta aplicação e escrevemos acima urlpatterns = []
app_name = 'app-application'
Essa linha atua como uma substituição do espaço para nome e foi projetada para tornar os principais urls.py mais limpos e legíveis, além da conveniência de alterar nomes em um só lugar.
Terceiro passo
Usamos a pesquisa em todo o projeto, dependendo do editor de código que você usa durante o desenvolvimento, essas podem ser teclas de atalho diferentes, acho que você as conhece, por isso não vou parar por aqui.
Nós dirigimos em:
is_authenticated()
E mude para
is_authenticated
. Agora, este não é um método, mas uma propriedade. Este erro lançará uma exceção.
Mais adiante no projeto, estamos procurando:
from django.core.urlresolvers import reverse
E mude para:
from django.urls import reverse
Quarto passo
Agora em todos os modelos.ForeignKey, deve haver um argumento posicional obrigatório "on_delete", por exemplo:
on_delete=models.CASCADE on_delete=models.DO_NOTHING on_delete=models.SET_NULL
Em seguida, fazemos:
python manage.py makemigrations python manage.py migrate
Quinto passo
Se você tentar iniciar o projeto, ele já deverá ser iniciado, mas imediatamente ocorrerá um erro assim que você for para 127.0.0.1:8000.
O erro será o seguinte:
AttributeError at / 'WSGIRequest' object has no attribute 'user'
Isso ocorre porque você precisa renomear MIDDLEWARE_CLASSES para MIDDLEWARE
Em seguida, você receberá o seguinte erro no console:
django.core.exceptions.ImproperlyConfigured: WSGI application 'application' could not be loaded; Error importing module: 'application doesn't look like a module path
Este erro ocorre porque você possui um middleware antigo e deve atualizá-los para:
'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'
Sexto passo
Se você usar seu próprio middleware no projeto, eles deverão ser herdados do MiddlewareMixin, e não do objeto (você também pode usar o objeto, mas precisará registrar métodos adicionais necessários).
Importar:
from django.utils.deprecation import MiddlewareMixin
Isso é tudo! :)
Obviamente, se você tem um projeto muito grande e usa um grande número de pacotes, terá mais problemas, mas uma cadeia de erros no console já o ajudará a resolvê-los e iniciar o projeto no modo adequado. Este guia descreve os principais erros e métodos para resolvê-los relevantes para todos os projetos com o Django 1.9 (alguns pontos não são relevantes para o Django versão 1.11) e ajudará a transferir o projeto para o Django 2.0 mais rapidamente, além de evitar perda desnecessária de tempo para analisar e pesquisar soluções para erros comuns.