Saya telah mengubah nama aplikasi di Django dengan mengganti nama foldernya, impor dan semua referensi (templat / indeks). Tapi sekarang saya mendapatkan kesalahan ini ketika saya mencoba menjalankanpython manage.py runserver
Error: Could not import settings 'nameofmynewapp.settings' (Is it on sys.path?): No module named settings
Bagaimana saya bisa men-debug dan mengatasi kesalahan ini? Ada petunjuk?
rename
fitur ini akan sangat membantu Anda dalam hal ini.Jawaban:
Ikuti langkah-langkah ini untuk mengubah nama aplikasi di Django:
views.py
,urls.py
, 'manage.py', dansettings.py
file.django_content_type
dengan perintah berikut:UPDATE django_content_type SET app_label='<NewAppName>' WHERE app_label='<OldAppName>'
ALTER TABLE <oldAppName>_modelName RENAME TO <newAppName>_modelName
. Untuk mysql juga saya pikir itu sama (seperti yang disebutkan oleh @null_radix)django_migrations
meja untuk menghindari migrasi sebelumnya kembali menjalankan:UPDATE django_migrations SET app='<NewAppName>' WHERE app='<OldAppName>'
. Catatan : ada beberapa perdebatan (dalam komentar) jika langkah ini diperlukan untuk Django 1.8+; Jika seseorang tahu pasti silakan perbarui di sini.models.py
Meta Class Anda telahapp_name
terdaftar, pastikan untuk mengganti nama juga (disebutkan oleh @will).static
atautemplates
folder Anda di dalam aplikasi, Anda juga harus mengganti nama folder tersebut. Misalnya, ganti namaold_app/static/old_app
menjadinew_app/static/new_app
.models
, Anda harus mengubahdjango_content_type.name
entri dalam DB. Untuk penggunaan postgreSQLUPDATE django_content_type SET name='<newModelName>' where name='<oldModelName>' AND app_label='<OldAppName>'
Meta point (Jika menggunakan virtualenv): Perlu dicatat, jika Anda mengganti nama direktori yang berisi virtualenv Anda, kemungkinan akan ada beberapa file di env Anda yang berisi path absolut dan juga perlu diperbarui. Jika Anda mendapatkan kesalahan seperti
ImportError: No module named ...
ini mungkin pelakunya. (terima kasih kepada @danyamachine untuk menyediakan ini).Referensi lain: Anda mungkin juga ingin merujuk tautan di bawah ini untuk gambar yang lebih lengkap
sumber
ALTER TABLE <oldAppName>_modelName RENAME TO <newAppName>_modelName
ALTER SEQUENCE <oldAppName>_<modelName>_<PK>_seq RENAME TO <newAppName>_<modelName>_<PK>_seq;
. Meskipun tidak perlu, sistem itu sendiri tidak peduli dengan namanya. Kolom DEFAULT menyimpan sebuahOID
('foo_pkey_seq'::regclass
), Anda dapat mengubah nama urutan tanpa memecahkannya - OID tetap sama.Baru di Django 1.7 adalah registri aplikasi yang menyimpan konfigurasi dan menyediakan introspeksi. Mesin ini memungkinkan Anda mengubah beberapa atribut aplikasi.
Poin utama yang ingin saya sampaikan adalah bahwa mengganti nama aplikasi tidak selalu diperlukan: Dengan konfigurasi aplikasi dimungkinkan untuk menyelesaikan aplikasi yang bertentangan. Tetapi juga cara untuk pergi jika aplikasi Anda membutuhkan penamaan yang ramah.
Sebagai contoh, saya ingin memberi nama aplikasi polling saya, 'Umpan balik dari pengguna'. Bunyinya seperti ini:
Buat
apps.py
file dipolls
direktori:Tambahkan konfigurasi aplikasi default ke
polls/__init__.py
:Untuk konfigurasi aplikasi lebih lanjut: https://docs.djangoproject.com/en/1.7/ref/applications/
sumber
Masalah menyenangkan! Saya harus segera mengganti nama banyak aplikasi, jadi saya melakukan dry run.
Metode ini memungkinkan kemajuan dibuat dalam langkah-langkah atom, untuk meminimalkan gangguan bagi pengembang lain yang bekerja pada aplikasi yang Anda ganti namanya.
Lihat tautan di bagian bawah jawaban ini untuk contoh kode yang berfungsi.
name
danlabel
ke default).INSTALLED_APPS
.db_table
ke nilai saat ini.db_table
"selalu" didefinisikan secara eksplisit.Ubah label aplikasi :
label
konfigurasi aplikasi ke nama aplikasi baru.<app_label>/<model_name>_<suffix>.html
)Jalankan SQL mentah untuk memperbaiki migrasi dan
content_types
aplikasi (sayangnya, beberapa SQL mentah tidak dapat dihindari). Anda tidak dapat menjalankan ini dalam migrasi.Pastikan tidak ada migrasi yang diperlukan (periksa langkah sebelumnya).
db_table
.makemigrations
begitu Django dapat mengubah nama tabel "ke default".name
.INSTALLED_APPS
referensi konfigurasi aplikasi.INSTALLED_APPS
.Contoh solusi: Saya telah membuat app-rename-example , contoh proyek tempat Anda dapat melihat bagaimana saya mengganti nama aplikasi, satu komit sekaligus.
Contoh ini menggunakan Python 2.7 dan Django 1.8, tapi saya yakin proses yang sama akan bekerja pada setidaknya Python 3.6 dan Django 2.1.
sumber
Jika Anda menggunakan PyCharm dan proyek berhenti berfungsi setelah mengganti nama:
sumber
Migrasi ulang pendekatan untuk pelat pembersih.
Ini bisa dilakukan tanpa rasa sakit JIKA aplikasi lain tidak mengganti model kunci asing dari aplikasi yang akan diganti namanya. Periksa dan pastikan file migrasi mereka tidak mencantumkan migrasi apa pun dari yang ini.
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', dansettings.py
file.delete from django_migrations where app = '<OldAppName>'
models.py
Meta Class Anda telahapp_name
terdaftar, pastikan untuk mengganti nama juga (disebutkan oleh @will).static
atautemplates
folder Anda di dalam aplikasi, Anda juga harus mengganti nama folder tersebut. Misalnya, ganti namaold_app/static/old_app
menjadinew_app/static/new_app
.sumber
Jika Anda menggunakan Pycharm , mengubah nama aplikasi sangat mudah dengan refactoring (
Shift
+F6
default) untuk semua file proyek.Tetapi pastikan Anda menghapus
__pycache__
folder di direktori proyek & sub-direktori-nya. Berhati-hatilah karena juga mengganti nama komentar yang dapat Anda kecualikan di jendela pratinjau refactor yang akan ditampilkan kepada Anda.Dan Anda harus mengganti nama OldNameConfig (AppConfig): sebagai tambahan
apps.py
dari aplikasi yang diubah namanya.Jika Anda tidak ingin kehilangan data dari basis data Anda, Anda harus melakukannya secara manual dengan kueri dalam basis data seperti jawaban yang disebutkan di atas.
sumber
Mengapa tidak gunakan saja opsi Find and Replace. (setiap editor kode memilikinya)?
Misalnya Kode Visual Studio (di bawah opsi Edit):
Anda cukup mengetikkan nama lama dan nama baru dan mengganti semua barang dalam proyek dengan satu klik.
CATATAN : Ini hanya mengganti nama konten file, BUKAN nama file dan folder. Jangan lupa mengganti nama folder, mis.
templates/my_app_name/
ganti namanya menjaditemplates/my_app_new_name/
sumber