AplikasiLink to this heading

Django mengandung sebuah registrar dari aplikasi terpasang yang menyimpan konfigurasi dan menyediakan introspeksi. Dia juga merawat daftar dari ketersediaan models.

Registri disebut apps dan tersedia dalam django.apps:

Code
>>> from django.apps import apps
>>> apps.get_app_config('admin').verbose_name
'Administration'

Proyek dan aplikasiLink to this heading

The term project describes a Django web application. The project Python package is defined primarily by a settings module, but it usually contains other things. For example, when you run django-admin startproject mysite you'll get a mysite project directory that contains a mysite Python package with settings.py, urls.py, asgi.py and wsgi.py. The project package is often extended to include things like fixtures, CSS, and templates which aren't tied to a particular application.

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.

It is important to understand that a Django application is a set of code that interacts with various parts of the framework. There's no such thing as an Application object. However, there's a few places where Django needs to interact with installed applications, mainly for configuration and also for introspection. That's why the application registry maintains metadata in an AppConfig instance for each installed application.

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 mengandung jalur bertitik pada sebuah modul aplikasi, Django memeriksa untuk variabel default_app_config dalam 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 pengarang aplikasiLink to this heading

Jika anda membuat sebuah aplikasi dapat dipasang dipanggil "Rock ’n’ roll", ini adalah bagaimana anda akan menyediakan sebuah nama pantas untuk admin:

Code
# rock_n_roll/apps.py

from django.apps import AppConfig

class RockNRollConfig(AppConfig):
    name = 'rock_n_roll'
    verbose_name = "Rock ’n’ roll"

Anda dapat membuat aplikasi anda memuat subkelas ini AppConfig subclass secara awal sebagai berikut:

Code
# rock_n_roll/__init__.py

default_app_config = 'rock_n_roll.apps.RockNRollConfig'

That will cause RockNRollConfig to be used when INSTALLED_APPS contains 'rock_n_roll'. This allows you to make use of AppConfig features without requiring your users to update their INSTALLED_APPS setting. Besides this use case, it's best to avoid using default_app_config and instead specify the app config class in INSTALLED_APPS as described next.

Tentu saja, anda dapa juga mengatakan pengguna anda untuk menaruh 'rock_n_roll.apps.RockNRollConfig' di pengaturan INSTALLED_APPS mereka. Anda dapat bahkan menyediakan beberapa perbedaan subkelas AppConfig dengan kebiasaan berbeda dan mengizinkan pengguna anda untuk memilih sati melalui pengaturan INSTALLED_APPS mereka.

Ketentuan yang dianjurkan adalah menaruh kelas konfigurasi di submodul dari aplikasi dipanggil apps. Bagaimanapun, ini tidak akan dipaksakan oleh Django.

Anda harus menyertakan atribut name untuk Django untuk menentukan aplikasi mana konfigurasi ini berlaku. Anda dapat menentukan atribut apapun didokumentasikan di acuan API AppConfig.

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:

Code
# 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, misalnya '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, misalnya '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, misalnya "Administrasi".

Atribut awal ke label.title().

AppConfig.pathLink to this definition

Jalur sistem berkas pada direktori aplikasi, misalnya '/usr/lib/pythonX.Y/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 AppConfig anda. 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 utama/akar untuk aplikasi, misalnya "<module 'django.contrib.admin' from 'django/contrib/admin/__init__.py'>".

AppConfig.models_moduleLink to this definition

Modul yang berisi model, misalnya "<module 'django.contrib.admin.models' from 'django/contrib/admin/models.py'>".

Itu mungkin None jika aplikasi tidak mengandung sebuah modul models. Catat bahwa basisdata terkait sinyal seperti pre_migrate dan post_migrate hanya dimunculkan untuk aplikasi yang mempunyai sebuah modul models

CaraLink to this heading

AppConfig.get_models()Link to this definition

Mengembalikan kelas Model berulang untuk aplikasi ini.

Membutuhkan aplikasi registrar untuk sepenuhnya dikumpulkan.

AppConfig.get_model(model_name, require_ready=True)Link to this definition

Mengembalikan Model dengan model_name diberikan. model_name adalah tidak sensitif.

Memunculkan LookupError jika tidak ada model yang ada dalam aplikasi ini.

Membutuhkan aplikasi regristrar untuk sepenuhnya dikumpulkan meskipun argumen require_ready disetel menjadi False. require_ready berperilaku tepat seperti dalam apps.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 AppConfig ditentukan, anda dapat mengimpor ready(), menggunakan antara pernyataan import atau get_model().

Jika anda sedang mendaftarkan model signals, anda dapat mengacu pada pengirim berdasarkan label deretan karakter nya daripada menggunakan kelas model itu sendiri.

Contoh:

Code
from django.apps import AppConfig
from django.db.models.signals import pre_save


class RockNRollConfig(AppConfig):
    # ...

    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 aplikasiLink to this heading

Paket-paket Python tanpa berkas __init__.py dikenal sebagai "namespace packages" dan mungkin tersebar di banyak direktori pada tempat berbeda di sys.path (see 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:

  1. Paket namespace sebenarnya mempunyai hanya tempat tunggal (yaitu tidak tersebar terhadap lebih dari satu direktori.)

  2. Kelas AppConfig digunakan untuk mengkonfigurasikan aplikasi yang mempunyai atribut kelas path, 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 True setelah registrar sepenuhnya dikumpulkan dan semua cara AppConfig.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 AppConfig untuk aplikasi dengan app_label. yang diberikan. Memunculkan LookupError jika tidak ada aplikasi.

apps.is_installed(app_name)Link to this definition

Memeriksa apakah aplikasi dengan nama diberikan anda di registrar. app_name adalah nama penuh dari aplikasi, misalnya 'django.contrib.admin'.

apps.get_model(app_label, model_name, require_ready=True)Link to this definition

Mengembalikan Model dengan app_label yang diberikan dan model_name. Sebagai sebuah jalan pintas, metode ini juga menerima argumen tunggal dalam bentuk app_label.model_name. model_name kasus-tidak peka.

Memunculkan LookupError jika tidak seperti aplikasi atau model ada. Memunculkan ValueError ketika dipanggil dengan argumen tunggal yang tidak mengandung satu titik.

Membutuhkan aplikasi regristrar untuk sepenuhnya dikumpulkan meskipun argumen require_ready disetel menjadi False.

Mengatur require_ready menjadi False mengizinkan pencarian model while the app registry is being populated, khususnya selama tahap kedua dimana itu mengimpor model. Kemudian get_model() mempunyai pengaruh sama ketika mengimpor model. Kasus penggunaan utama adalah mengkonfigurasi kelas-kelas model dengan pengaturan, seperti AUTH_USER_MODEL.

Ketika require_ready adalah False, 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 membiarkan require_ready ke nilai awalan dari True kapanpun 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_prefix adalah True, pengaturan awalan tulisan penyelesai URL ke FORCE_SCRIPT_NAME jika 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.

  1. Django pertama mengimpor setiap barang di INSTALLED_APPS.

    Jika itu sebuah kelas konfigurasi aplikasi, Django impor paket akar dari aplikasi, ditentukan oleh atribut name nya. 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.

  2. Kemudian Django berusaha mengimpor submodul model dari setiap aplikasi, jika memang ada.

    Anda harus menentukan atau mengimpor semua model di aplikasi models.py anda atau models/__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.

  3. 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, gettext() menggunakan registrar aplikasi untuk mencari katalog terjemahan di aplikasi. Untuk menterjemahkan pada waktu impor, anda butuh gettext_lazy() sebagai gantinya. (Menggunakan gettext() akan berupa sebuah 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.admin automatically performs autodiscovery of admin modules in installed applications. To prevent it, change your INSTALLED_APPS to contain 'django.contrib.admin.apps.SimpleAdminConfig' instead of 'django.contrib.admin'.