AplikasiLink to this heading
Django mengandung sebuah registrar dari aplikasi terpasang yang menyimpan konfigurasi dan menyediakan introspeksi. Dia juga merawat daftar dari ketersediaan models.
Registrar ini hanya disebut apps dan tersedia di django.apps:
>>> from django.apps import apps
>>> apps.get_app_config('admin').verbose_name
'Admin'
Proyek dan aplikasiLink to this heading
Istilah proyek menggambarkan sebuah aplikasi Django. Proyek paket Python ditentukan terutama dengan mengatur modul, tetapi biasanya mengandung hal lain. Sebagai contoh, ketika anda menjalankan django-admin startproject mysite anda akan mendapatkan sebuah direktori proyek mysite yang mengandung sebuah paket Python mysite dengan settings.py, urls.py, dan wsgi.py. Paket proyek sering diperluas untuk disertakan untuk menyertakan hal-hal seperti perbaikan, CSS, dan cetakan yang tidak diikat ke aplikasi tertentu.
Sebuah direktori akar proyek (satu yang mengandung manage.py) biasanya mengandung semua aplikasi proyek yang tidak dipasang secara terpisah.
Istilah aplikasi menggambarkan paket Python yang menyediakan beberapa kumpulan fitur. Aplikasi may be reused di beragam proyek.
Aplikasi menyertakan beberapa kombinasi model, tampilan, cetakan, etiket cetakan, berkas tetap, URL, middleware, dll. Mereka umumnya diikat kedalam proyek dengan pengaturan INSTALLED_APPS dan secara pilihan dengan mekanisme lain seperti URLconf, pengaturan MIDDLEWARE, atau warisan cetakan.
Sangat penting untuk dimengerti bahwa aplikasi Django hanyalah kumpulan kode yang saling mempengaruhi dengan beragam bagian dari kerangka. Tidak ada sesuatu seperti obyek Aplikasi. Bagaimanapun, terdapat sedikit tempat dimana Django butuh saling mempengaruhi dengan aplikasi terpasang, terutama untuk konfigurasi dan juga untuk introspeksi. Itu mengapa registrar aplikasi merawat metadata dalam sebuah instance AppConfig untuk setiap aplikasi terpasang.
Tidak ada batasan bahwa sebuah paket proyek tidak dapat dianggap sebuah aplikasi dan mempunyai model, dll. (yang akan butuh menambahkannya ke INSTALLED_APPS).
Konfigurasi aplikasiLink to this heading
Untuk mengkonfigurasi sebuah aplikasi, subkelas AppConfig dan menaruh jalur titik ke subkelas tersebut dalam INSTALLED_APPS.
Ketika INSTALLED_APPS sederhana mengandung jalur titik ke modul aplikasi, Django memeriksa untuk variabel default_app_config di modul tersebut.
Jika dia ditentukan, jalur bertitik ke subkelas AppConfig untuk aplikasi tersebut.
Jika tidak ada default_app_config, Django menggunakan kelas dasar AppConfig.
default_app_config mengizinkan aplikasi yang mendahului Django 1.7 seperti django.contrib.admin` untuk memasukkan ke fitur AppConfig tanpa membutuhkan pengguna memperbaharui INSTALLED_APPS mereka.
Aplikasi baru harus menghindari default_app_config. Sebagai gantinya mereka harus butuh jalur bertitik ke subkelas AppConfig sesuai untuk di konfigurasi secara eksplisit di INSTALLED_APPS.
Untuk pengguna aplikasiLink to this heading
Jika anda menggunakan "Rock ’n’ roll" dalam proyek disebut anthology, tetapi anda ingin menampilkan "Jazz Manouche", anda dapat menyediakan konfigurasi anda sendiri:
# anthology/apps.py
from rock_n_roll.apps import RockNRollConfig
class JazzManoucheConfig(RockNRollConfig):
verbose_name = "Jazz Manouche"
# anthology/settings.py
INSTALLED_APPS = [
'anthology.apps.JazzManoucheConfig',
# ...
]
Lagi, menentukan kelas konfigurasi proyek-khusus di submodul dipanggil apps adalah sebuah ketentuan, bukan sebuah persyaratan.
Konfigurasi aplikasiLink to this heading
- class AppConfigLink to this definition
Konfigurasi aplikasi obyek menyimpan metadata untuk sebuah aplikasi. Beberapa atribut dapat dikonfigurasikan di subkelas
AppConfig. Lainnya disetel oleh Django dan hanya-baca.
Atribut dapat dikonfigurasiLink to this heading
- AppConfig.nameLink to this definition
Jalur Phyton penuh ke aplikasi, sebagai contoh
'django.contrib.admin'.Atribut ini menentukan konfigurasi aplikasi mana yang berlaku. DIa harus disetel di semua subkelas
AppConfig.Dia harus unik terhadap proyek Django.
- AppConfig.labelLink to this definition
Nama pendek untuk aplikasi, sebagai contoh
'admin'Atribut ini mengizinkan melabel kembali sebuah aplikasi ketika dua aplikasi mempunyai label bertentangan. Awal dia ke komponen terakhir dari
name. Dia harus penciri Python yang sah.Dia harus unik terhadap proyek Django.
- AppConfig.verbose_nameLink to this definition
Nama dapat dibaca manusia untuk aplikasi, sebagai contoh "Administrasi".
Atribut awal ke
label.title().
- AppConfig.pathLink to this definition
Jalur sistem berkas pada direktori aplikasi, sebagai contoh
'/usr/lib/python3.4/dist-packages/django/contrib/admin'.Dalam banyak kasus, Django dapat otomatis mengenali dan mengatur ini, tetapi anda dapat juga menyediakan menimpa eksplisit sebagai atribut kelas di subkelas
AppConfiganda. Dalam beberapa situasi ini diwajibkan; sebagai contoh jika paket aplikasi adalah namespace package dengan banyak jalur.
Atribut hanya-bacaLink to this heading
- AppConfig.moduleLink to this definition
Modul akar untuk aplikasi, sebagai contoh
<module 'django.contrib.admin' from 'django/contrib/admin/__init__.pyc'>.
- AppConfig.models_moduleLink to this definition
Modul mengandung model, sebagai contoh
<module 'django.contrib.admin.models' from 'django/contrib/admin/models.pyc'>.Itu mungkin
Nonejika aplikasi tidak mengandung sebuah modulmodels. Catat bahwa basisdata terkait sinyal sepertipre_migratedanpost_migratehanya dimunculkan untuk aplikasi yang mempunyai sebuah modulmodels
CaraLink to this heading
- AppConfig.get_models()Link to this definition
Mengembalikan kelas
Modelberulang untuk aplikasi ini.Membutuhkan aplikasi registrar untuk sepenuhnya dikumpulkan.
- AppConfig.get_model(model_name, require_ready=True)Link to this definition
Mengembalikan
Modeldenganmodel_namediberikan.model_nameadalah tidak sensitif.Memunculkan
LookupErrorjika tidak ada model yang ada dalam aplikasi ini.Membutuhkan aplikasi regristrar untuk sepenuhnya dikumpulkan meskipun argumen
require_readydisetel menjadiFalse.require_readyberperilaku tepat seperti dalamapps.get_model().
- AppConfig.ready()Link to this definition
Subkelas dapat menimpa metode ini untuk melakukan tugas inisialisasi seperti mendaftarkan sinyal. Dia dipanggil segera ketika registrar dikumpulkan penuh.
Meskipun anda tidak dapat mengimpor pada tingkat-modul dimana kelas-kelas
AppConfigditentukan, anda dapat mengimporready(), menggunakan antara pernyataanimportatauget_model().Jika anda sedang mendaftarkan
model signals, anda dapat mengacu pada pengirim berdasarkan label deretan karakter nya daripada menggunakan kelas model itu sendiri.Contoh:
from django.db.models.signals import pre_save def ready(self): # importing model classes from .models import MyModel # or... MyModel = self.get_model('MyModel') # registering signals with the model's string label pre_save.connect(receiver, sender='app_label.MyModel')
Paket namespace sebagai aplikasi (Python 3.3+)Link to this heading
Phyton versi 3.3 dan kemudian mendukung paket Phyton tanpa berkas __init__.py. Paket ini dikenal sebagai "paket namespace" dan mungkin tersebar terhadap banyak direktori pada tempat berbeda di sys.path (lihat PEP 420).
Aplikasi Django membutuhkan sebuah jalus sistem berkas berbasis tunggal dimana Django (tergantung pada konfigurasi) akan mencari cetakan, aset tetap, dll. Hingga, paket namespace mungkin hanya aplikasi Django jika satu dari hal berikut adalah benar:
Paket namespace sebenarnya mempunyai hanya tempat tunggal (yaitu tidak tersebar terhadap lebih dari satu direktori.)
Kelas
AppConfigdigunakan untuk mengkonfigurasikan aplikasi yang mempunyai atribut kelaspath, yang merupakan jalur direktori mutlak Django akan digunakan sebagai jalur dasar tunggal untuk aplikasi.
Jika tidak satupun dari kondisi ini bertemu, Django akan memunculkan ImproperlyConfigured.
Registrar aplikasiLink to this heading
- appsLink to this definition
Registrar aplikasi menyediakan API umum berikut. Cara yang tidak ada di daftar dibawah ini dianggap pribadi dan mungkin berubah tanpa pemberitahuan.
- apps.readyLink to this definition
Atribut Boolean yang disetel ke
Truesetelah registrar sepenuhnya dikumpulkan dan semua caraAppConfig.ready()dipanggil.
- apps.get_app_configs()Link to this definition
Mengembalikan instance berulang dari
AppConfig.
- apps.get_app_config(app_label)Link to this definition
Mengembalikan sebuah
AppConfiguntuk aplikasi denganapp_label. yang diberikan. MemunculkanLookupErrorjika tidak ada aplikasi.
- apps.is_installed(app_name)Link to this definition
Memeriksa apakah aplikasi dengan nama diberikan anda di registrar.
app_nameadalah nama penuh dari aplikasi, sebagai contoh'django.contrib.admin'.
- apps.get_model(app_label, model_name, require_ready=True)Link to this definition
Mengembalikan
Modeldenganapp_labelyang diberikan danmodel_name. Sebagai sebuah jalan pintas, metode ini juga menerima argumen tunggal dalam bentukapp_label.model_name.model_namekasus-tidak peka.Memunculkan
LookupErrorjika tidak seperti aplikasi atau model ada. MemunculkanValueErrorketika dipanggil dengan argumen tunggal yang tidak mengandung satu titik.Membutuhkan aplikasi regristrar untuk sepenuhnya dikumpulkan meskipun argumen
require_readydisetel menjadiFalse.Mengatur
require_readymenjadiFalsemengizinkan pencarian model while the app registry is being populated, khususnya selama tahap kedua dimana itu mengimpor model. Kemudianget_model()mempunyai pengaruh sama ketika mengimpor model. Kasus penggunaan utama adalah mengkonfigurasi kelas-kelas model dengan pengaturan, sepertiAUTH_USER_MODEL.Ketika
require_readyadalahFalse,get_model()mengembalikan sebuah kelas model yang mungkin tidak sepenuhnya berfungsi (accessor balikan mungkin hilang, sebagai contoh) sampai aplikasi regristrar sepenuhnya dikumpulkan. Untuk alasan ini, itu adalah terbaik untuk membiarkanrequire_readyke nilai awalan dariTruekapanpun memungkinkan.
Inisialisasi pengolahanLink to this heading
Bagaimana aplikasi dimuatLink to this heading
Ketika Django mulai, django.setup() bertanggung jawab untuk mengumpulkan registrar aplikasi.
- setup(set_prefix=True)Link to this definition
Konfigurasi Django oleh:
Memuat pengaturan.
Mengatur pencatatan.
Jika
set_prefixadalah True, pengaturan awalan tulisan penyelesai URL keFORCE_SCRIPT_NAMEjika ditentukan, atau jika tidak/.Memulai registrar aplikasi
Fungsi ini dipanggil otomatis:
Ketika menjalankan peladen HTTP melalui dukungan WSGI Django.
Ketika meminta perintah pengelolaan.
Dia harus dipanggil secara tersirat di kasus lain, sebagai contoh di tulisan Phyton.
Registrar aplikasi dimulai dalam tiga tingkatan, Pada setiap tingkatan, Django mengolah semua aplikasi berdasarkan dari INSTALLED_APPS.
Django pertama mengimpor setiap barang di
INSTALLED_APPS.Jika itu sebuah kelas konfigurasi aplikasi, Django impor paket akar dari aplikasi, ditentukan oleh atribut
namenya. Jika itu adalah sebuah paket Python, Django membuat konfigurasi aplikasi awal.Pada tingkatan ini, kode anda jangan mengimpor model apapun!
Dengan kata lain, paket akar aplikasi anda dan modul yang menentukan kelas-kelas konfigurasi aplikasi anda jangan impor model apapun, bahkan secara tidak langsung.
Sesungguhnya, Django mengizinkan mengimpor model sekali konfigurasi aplikasi mereka dimuat. Bagaimanapun, agar menghindari kendala yang tidak perlu pada urutan
INSTALLED_APPS, sangat dianjurkan tidak mengimpor model apapun pada tingkatan ini.Sekali tingkatan ini lengkap, API yang menjalankan konfigurasi aplikasi seperti
get_app_config()menjadi tidak berguna.Kemudian Django berusaha mengimpor submodul
modeldari setiap aplikasi, jika memang ada.Anda harus menentukan atau mengimpor semua model di aplikasi
models.pyanda ataumodels/__init__.py. Sebaliknya, registri aplikasi mungkin tidak dikumpulkan penuh pada titik ini, yang dapat menyebabkan ORM tidak berfungsi.Ketika tingkatan ini lengkap, API yang bekerja di model seperti
get_model()menjadi dapat digunakan.Akhirnya Django menjalankan cara
ready()dari setiap konfigurasi aplikasi.
Menyelesaikan masalahLink to this heading
Disini beberapa masalah umum yang mungkin muncul selama inisialisasi:
AppRegistryNotReady: Ini terjadi ketika mengimpor sebuah konfigurasi aplikasi atau sebuah kode pemicu modul model yang bergantung di registri aplikasi.Sebagai contoh,
ugettext()menggunakan registrar aplikasi untuk mencari katalog terjemahan di aplikasi. Untuk menterjemah pada waktu impor, anda butuhugettext_lazy(). (menggunakanugettext()akan menjadi kesalahan, karena terjemahan akan terjadi pada waktu impor, daripada setiap permintaan tergantung pada bahasa aktif.)Menjalankan permintaan basisdata dengan ORM pada waktu impor dalam modul model juga akan memicu pengecualian ini. ORM tidak dapat berfungsi dengan benar sampai semua model tersedia.
Pengecualian ini juga terjadi jika anda lupa memanggil
django.setup()di tulisan berdiri sendiri.ImportError: tidak dapat impor nama ...Ini terjadi jika urutan impor berakhir dalam perulangan.Untuk mengurangi permasalahan tersebut, anda harus mengecilkan ketergantungan diantara model anda dan melakukan sedikit pekerjaan sebisa mungkin pada waktu impor. Untuk menghindari penjalanan kode pada waktu impor, anda dapat memindahkannya dan menembolok hasilnya. Kode akan dikerjakan ketika anda pertama butuh hasilnya. Konsep ini dikenal sebagai "lazy evaluation".
django.contrib.adminautomatically performs autodiscovery ofadminmodules in installed applications. To prevent it, change yourINSTALLED_APPSto contain'django.contrib.admin.apps.SimpleAdminConfig'instead of'django.contrib.admin'.