Mudei o nome de um aplicativo no Django renomeando sua pasta, importações e todas as suas referências (modelos / índices). Mas agora eu recebo esse erro quando tento executarpython manage.py runserver
Error: Could not import settings 'nameofmynewapp.settings' (Is it on sys.path?): No module named settings
Como posso depurar e resolver esse erro? Alguma pista?
rename
recurso o ajudará bastante com isso.Respostas:
Siga estas etapas para alterar o nome de um aplicativo no Django:
views.py
,urls.py
'manage.py', esettings.py
arquivos.django_content_type
com o seguinte comando:UPDATE django_content_type SET app_label='<NewAppName>' WHERE app_label='<OldAppName>'
ALTER TABLE <oldAppName>_modelName RENAME TO <newAppName>_modelName
. Para o mysql também acho que é o mesmo (como mencionado por @null_radix)django_migrations
tabela para evitar ter suas migrações anteriores re-executar:UPDATE django_migrations SET app='<NewAppName>' WHERE app='<OldAppName>'
. Nota : há algum debate (nos comentários) se esta etapa é necessária para o Django 1.8+; Se alguém souber ao certo, atualize aqui.models.py
classe Meta estiverapp_name
listada, renomeie-a também (mencionada por @will).static
ou astemplates
pastas dentro do aplicativo, também precisará renomeá-las. Por exemplo, renomeieold_app/static/old_app
paranew_app/static/new_app
.models
, você precisará alterar adjango_content_type.name
entrada no DB. Para uso do postgreSQLUPDATE django_content_type SET name='<newModelName>' where name='<oldModelName>' AND app_label='<OldAppName>'
Meta-ponto (se estiver usando virtualenv): Vale a pena notar que, se você estiver renomeando o diretório que contém sua virtualenv, provavelmente haverá vários arquivos em seu ambiente que contêm um caminho absoluto e também precisam ser atualizados. Se você estiver recebendo erros como
ImportError: No module named ...
esse, pode ser o culpado. (obrigado a @danyamachine por fornecer isso).Outras referências: você também pode consultar os links abaixo para obter uma imagem mais completa
fonte
ALTER TABLE <oldAppName>_modelName RENAME TO <newAppName>_modelName
ALTER SEQUENCE <oldAppName>_<modelName>_<PK>_seq RENAME TO <newAppName>_<modelName>_<PK>_seq;
. Embora não seja necessário, o sistema em si não se importa com o nome. A coluna DEFAULT armazena umOID
('foo_pkey_seq'::regclass
), você pode alterar o nome da sequência sem interromper isso - o OID permanece o mesmo.O novo no Django 1.7 é um registro de aplicativo que armazena a configuração e fornece introspecção. Esse mecanismo permite alterar vários atributos do aplicativo.
O ponto principal que quero destacar é que nem sempre é necessário renomear um aplicativo: Com a configuração do aplicativo, é possível resolver aplicativos conflitantes. Mas também o caminho a percorrer se o seu aplicativo precisar de nomes amigáveis.
Como exemplo, desejo nomear meu aplicativo de pesquisas como 'Feedback dos usuários'. É assim:
Crie um
apps.py
arquivo nopolls
diretório:Adicione a configuração padrão do aplicativo ao seu
polls/__init__.py
:Para mais configurações de aplicativos: https://docs.djangoproject.com/en/1.7/ref/applications/
fonte
Problema divertido! Vou ter que renomear muitos aplicativos em breve, então fiz uma execução a seco.
Esse método permite avançar em etapas atômicas, para minimizar as interrupções de outros desenvolvedores que trabalham no aplicativo que você está renomeando.
Veja o link na parte inferior desta resposta para obter exemplos de código de trabalho.
name
elabel
para os padrões).INSTALLED_APPS
.db_table
o valor atual.db_table
"sempre" sejam definidas explicitamente.Altere o rótulo do aplicativo :
label
na configuração do aplicativo como o novo nome do aplicativo.<app_label>/<model_name>_<suffix>.html
)Execute o SQL bruto para corrigir migrações e
content_types
aplicativos (infelizmente, algum SQL bruto é inevitável). Você não pode executar isso em uma migração.Verifique se não são necessárias migrações (verifica a etapa anterior).
db_table
.makemigrations
para que o django possa renomear a tabela "para o padrão".name
.INSTALLED_APPS
referência à configuração do aplicativo.INSTALLED_APPS
.Solução de exemplo: eu criei app-rename-example , um projeto de exemplo em que você pode ver como renomeei um aplicativo, um commit por vez.
O exemplo usa Python 2.7 e Django 1.8, mas estou confiante de que o mesmo processo funcionará em pelo menos Python 3.6 e Django 2.1.
fonte
Caso você esteja usando PyCharm e o projeto pare de funcionar após renomear:
fonte
Migrar novamente a abordagem para uma placa mais limpa.
Isso pode ser feito sem problemas se outros aplicativos não tiverem modelos de chave estrangeira do aplicativo a serem renomeados. Verifique e verifique se os arquivos de migração não listam nenhuma migração desta.
delete from auth_permission where content_type_id in (select id from django_content_type where app_label = '<OldAppName>')
delete from django_content_type where app_label = '<OldAppName>'
views.py
,urls.py
'manage.py', esettings.py
arquivos.delete from django_migrations where app = '<OldAppName>'
models.py
classe Meta estiverapp_name
listada, renomeie-a também (mencionada por @will).static
ou astemplates
pastas dentro do aplicativo, também precisará renomeá-las. Por exemplo, renomeieold_app/static/old_app
paranew_app/static/new_app
.fonte
Se você usa o Pycharm , renomear um aplicativo é muito fácil com a refatoração (
Shift
+F6
padrão) para todos os arquivos do projeto.Mas certifique-se de excluir as
__pycache__
pastas no diretório do projeto e seus subdiretórios. Também tenha cuidado, pois também renomeia os comentários, que você pode excluir na janela de visualização do refatorador, que será exibida.E você terá que renomear OldNameConfig (AppConfig): além
apps.py
do seu aplicativo renomeado.Se você não deseja perder dados do seu banco de dados, precisará fazê-lo manualmente com a consulta no banco de dados, como a resposta mencionada acima.
fonte
Por que não usar a opção Localizar e substituir? (todo editor de código possui)?
Por exemplo, código do Visual Studio (na opção Editar):
Você apenas digita o nome antigo e o novo nome e substitui tudo no projeto com um clique.
NOTA : Isso renomeia apenas o conteúdo do arquivo, NÃO os nomes dos arquivos e pastas. Não se esqueça de renomear pastas, por exemplo.
templates/my_app_name/
renomeie-o paratemplates/my_app_new_name/
fonte