Situs admin Django¶
Satu dari bagian yang paling berkuasa dari Django adalah antarmuka admin otomatis. Itu membaca metadata dari model anda untuk menyediakan cepat, antarmuka terpusat-model dimana pengguna dipercaya dapat mengelola isi pada situs anda. Dianjurkan admin menggunakan batasannya ke sebuah alat pengelola internal organisasi. Itu tidak dimaksudkan untuk membangun keseluruhan front end disekeliling.
Admin mempunyai banyak kaitan untuk penyesuaian, tetapi hati-hati dari mencoba menggunakan kaitan tersebut secara khusus. Jika anda butuh menyediakan antarmuka pengolahan-terpusat yang memisahkan rincian penerapan dari tabel-tabel dan bidang-bidang basisdata, kemudian itu mungkin waktu utuk menulis tampilan anda sendiri.
Di dokumen ini kami mengobrol bagaimana mengaktifkan pengguna, menggunakan, dan menyesuaikan antarmuka admin Django.
Ikhtisar¶
Admin diadakan di cetakan proyek awalan digunakan oleh startproject.
Untuk acuan, ini adalah persyaratan:
- Tambah
'django.contrib.admin'ke pengaturanINSTALLED_APPSanda. - Admin mempunyai empat ketergantungan -
django.contrib.auth,django.contrib.contenttypes,django.contrib.messagesdandjango.contrib.sessions. Jika aplikasi ini tidak di daftarINSTALLED_APPSanda, tambah mereka. - Tambah
django.contrib.auth.context_processors.authdandjango.contrib.messages.context_processors.messagespada pilihan'context_processors'dari backendDjangoTemplatesditentukan diTEMPLATESanda sama halnyadjango.contrib.auth.middleware.AuthenticationMiddlewaredandjango.contrib.messages.middleware.MessageMiddlewarepadaMIDDLEWARE. Ini semua aktif secara awalan, jadi anda hanya butuh melakukan ini jika anda telah secara manual merubah pengaturan. - Tentukan yang mana dari model aplikasi anda harus disunting di antarmuka admin.
- Untuk setiap dari model-model tersebut, pilihan buat sebuah kelas
ModelAdminyang membungkus disesuaikan fungsionalitas admin dan pilihan untuk model tertentu itu. - Instansiasi sebuah
AdminSitedan memberitahu itu tentang setiap dari model anda dan kelas-kelasModelAdmin. - Mengkaitkan instance
AdminSitekedalam URLconf anda.
Setelah anda mengambil langkah-langkah ini, anda akan dapat menggunakan situs admin Django anda dengan mengunjungi URL anda tautkan itu kedalam (/admin/, secara awalan). Jika anda butuh membuat seorang pengguna untuk masuk, anda dapat menggunakan perintah createsuperuser.
Topik lainnya¶
lihat juga
Untuk informasi tentang melayani berkas-berkas tetap (gambar, JavaScript, dan CSS) terhubung dengan admin di produksi, lihat Melayani berkas.
Mempunyai masalah? Coba FAQ: Admin.
Obyek ModelAdmin¶
-
class
ModelAdmin[sumber]¶ Kelas
ModelAdminadalah perwakilan dari sebuah model di antarmuka admin. Biasanya, ini disimpan di berkas bernamaadmin.pydi aplikasi anda. Mari kita melihat consoh sangat sederhana dariModelAdmin:from django.contrib import admin from myproject.myapp.models import Author class AuthorAdmin(admin.ModelAdmin): pass admin.site.register(Author, AuthorAdmin)
Apakah anda butuh sebuah obyek
ModelAdminsama sekali?Di contoh terdahulu, kelas
ModelAdmintidak menentukan nilai-nilai penyesuaian apapun (pun). Sebagai hasil, awalan antarmuka admin akan disediakan. Jika anda senang dengan awalan antarmuka admin, anda tidak butuh menentukan sebuah obyekModelAdminsama sekali -- anda dapat mendafta kelas model tanpa menyediakan sebuah gambaranModelAdmin. Contoh terdahulu dapat disederhanakan menjadi:from django.contrib import admin from myproject.myapp.models import Author admin.site.register(Author)
Penghias register¶
-
register(*models, site=django.admin.sites.site)[sumber]¶ Ada juga sebuah penghias untuk mendaftarkan kelas-kelas
ModelAdminanda:from django.contrib import admin from .models import Author @admin.register(Author) class AuthorAdmin(admin.ModelAdmin): pass
It's given one or more model classes to register with the
ModelAdmin. If you're using a customAdminSite, pass it using thesitekeyword argument:from django.contrib import admin from .models import Author, Editor, Reader from myproject.admin_site import custom_admin_site @admin.register(Author, Reader, Editor, site=custom_admin_site) class PersonAdmin(admin.ModelAdmin): pass
You can't use this decorator if you have to reference your model admin class in its
__init__()method, e.g.super(PersonAdmin, self).__init__(*args, **kwargs). You can usesuper().__init__(*args, **kwargs).
Penemuan dari berkas admin¶
Ketika anda menaruh 'django.contrib.admin' di pengaturan INSTALLED_APPS anda, Django secara otomatis mencari modul admin di setiap aplikasi dan mengimpor itu.
-
class
apps.AdminConfig¶ Ini adalah awalan kelas
AppConfiguntuk admin. Itu memanggilautodiscover()ketika Django mulai.
-
class
apps.SimpleAdminConfig¶ Kelas ini bekerja seperti
AdminConfig, kecuali itu tidak memanggilautodiscover().
-
autodiscover()[sumber]¶ Fungsi ini berusaha mengimpor sebuah modul
admindi setiap aplikasi terpasang. Modul-modul itu diharapkan mendaftar model dengan admin.Secara khusus anda tidak butuh memanggil fungsi ini secara langsung sebagai
AdminConfigmemanggilnya ketika Django mulai.
Jika anda sedang menggunakan sebuah penyesuaian AdminSite, itu adalah umum mengimpor semua dari subkelas ModelAdmin kedalam kode anda dan mendaftarkan mereka ke penyesuaian AdminSite. Dalam hal itu, untuk meniadakan penemuan-otomatis, anda harus menaruh 'django.contrib.admin.apps.SimpleAdminConfig' sebagai gantinya 'django.contrib.admin' di pengaturan INSTALLED_APPS anda.
Pilihan ModelAdmin¶
ModelAdmin sangat fleksibel. Itu mempunyai beberapa pilihan untuk berurusan dengan menyesuaikan antarmuka. Semua pilihan ditentukan pada subkelas ModelAdmin:
from django.contrib import admin
class AuthorAdmin(admin.ModelAdmin):
date_hierarchy = 'pub_date'
-
ModelAdmin.actions¶ Sebuah daftar tindakan untuk membuat tersedia pada halaman daftar perubahan. Lihat Tindakan admin untuk rincian.
-
ModelAdmin.actions_on_top¶
-
ModelAdmin.actions_on_bottom¶ Kendalikan dimana pada halaman batang tindakan muncul. Secara awalan daftar rubah admin memperlihatkan tindakan pada atas dari halaman (
actions_on_top = True; actions_on_bottom = False).
-
ModelAdmin.actions_selection_counter¶ Kendalikan apakah sebuah penghitung pemilihan ditampilkan dekat tindakan dropdown. Secara awalan, daftar tubadh admin akan memperlihatkan itu (
actions_selection_counter = True).
-
ModelAdmin.date_hierarchy¶ Setel
date_hierarchypada nama dariDateFieldatauDateTimeFielddi model anda, dan halaman daftar rubah akan menyertakan navigasi penelusuran berdasarkan-tanggal oleh bidang itu.Contoh:
date_hierarchy = 'pub_date'
Anda dapat juga menentukan sebuah bidang pada model terkait menggunakan pencarian
__, sebagai contoh:date_hierarchy = 'author__pub_date'
Ini akan secara cerdas mengumpulkan itu sendiri berdasarkan pada tanggal tersedia, sebagai contoh jika semua tanggal berada di satu bulan, itu akan menampilkan hanya penelesuran tingkat-hari.
Changed in Django 1.11:Kemampuan untuk mengacukan bidang-bidang pada model-model terkait telah ditambahkan.
Catatan
date_hierarchymenggunakanQuerySet.datetimes()secara internal. Harap mengacu ke dokumentasinya untuk beberapa peringatan ketika dukungan zona waktu diadakan (USE_TZ = True).
-
ModelAdmin.empty_value_display¶ Atribut ini menimpa nilai pertunjukan awalan untuk bidang rekaman yang kosong (
None, string kosong, dll). Nilai awalan-(sebuah tanda garis). Sebagai contoh:from django.contrib import admin class AuthorAdmin(admin.ModelAdmin): empty_value_display = '-empty-'
Anda dapat juga menimpa
empty_value_displayuntuk semua halaman admin denganAdminSite.empty_value_display, atau bidang-bidang tertentu seperti ini:from django.contrib import admin class AuthorAdmin(admin.ModelAdmin): fields = ('name', 'title', 'view_birth_date') def view_birth_date(self, obj): return obj.birth_date view_birth_date.empty_value_display = '???'
-
ModelAdmin.exclude¶ Atribut ini, jika diberikan, harus berupa daftar dari nama-nama bidang untuk mengeluarkan dari formulir.
Sebagai contoh, mari kita pertimbangkan model berikut:
from django.db import models class Author(models.Model): name = models.CharField(max_length=100) title = models.CharField(max_length=3) birth_date = models.DateField(blank=True, null=True)
Jika anda ingin sebuah formulit untuk model
Authoryang menyertakan hanya bidangnamedantitle, anda akan menentukanfieldsatauexcludeseperti ini:from django.contrib import admin class AuthorAdmin(admin.ModelAdmin): fields = ('name', 'title') class AuthorAdmin(admin.ModelAdmin): exclude = ('birth_date',)
Sejak model Author hanya mempunyai tiga bidang,
name,title, danbirth_date, formulir dihasilkan dari pernyataan diatas akan mengandung bidang-bidang sama persis.
-
ModelAdmin.fields¶ Gunakan pilihan
fieldsuntuk membuat perubahan tata letak sederhana di formulir pada halaman "add" dan "change" seperti menunjukkan hanya subhimpunan dari bidang-bidang tersedia, merubah urutan mereka, atau mengelompokkan mereka kedalam baris. Sebagai contoh, anda dapat menentukan versi sederhana dari formulir admin untuk modeldjango.contrib.flatpages.models.FlatPageseperi berikut:class FlatPageAdmin(admin.ModelAdmin): fields = ('url', 'title', 'content')
Di contoh diatas, hanya bidang-bidang
url,titledancontentakan diperlihatkan, berurutan, di formulir.fieldsdapat mengandung nilai-nilai ditentukan diModelAdmin.readonly_fieldsuntuk diperlihatkan sebagai hanya-baca.Untuk kebutuhan tata letak lebih rumit, lihat pilihan
fieldsets.Pilihan
fields, tidak sepertilist_display, mungkin hanya mengandung nama-nama bidang pada model atau formulir ditentukan olehform. Itu mungkin mengandung hanya callable jika mereka berada didaftar direadonly_fields.Untuk memperlihatkan banyak bidang pada baris yang sama, bungkus bidang-bidang tersebut di tuple mereka sendiri. Di contoh ini, bidang
urldantitleakan diperlihatkan di baris sama dan bidangcontentakan diperlihatkan dibawah mereka pada baris nya sendiri:class FlatPageAdmin(admin.ModelAdmin): fields = (('url', 'title'), 'content')
Catatan
Pilihan
fieldsini tidak harus membingungkan dengan kunci kamusfieldsyaitu dalam pilihanfieldsets, seperti digambarkan di bagian selanjutnya.Jika tidak ada pilihan
fieldsmaupunfieldsetshadir, Django akan mengawalkan ke menampilkan setiap bidang yang bukan sebuahAutoFielddan mempunyaieditable=True, dalam fieldset tunggal, di urutan sama seperti bidang-bidang ditentukan di model
-
ModelAdmin.fieldsets¶ Setel
fieldsetsutuk mengendalikan tata letak dari halaman "add" dan "change" admin.fieldsetsadalah daftar dari dua-tuple, yang setiap dua-tuple mewakili sebuah<fieldset>pada halaman formulir admin. (Sebuah<fieldset>adalah sebuah "section" dari formulir.)Dua-tuple dalam bentuk
(name, field_options), dimananameadalah sebuah string mewakili juful dari fieldset danfield_optionsadalah sebuah kamus dari informasi tentang fieldset, termasuk daftar dari bidang-bidang untuk ditampilkan di itu.Sebuah contoh penuh, diambil dari model
django.contrib.flatpages.models.FlatPagefrom django.contrib import admin class FlatPageAdmin(admin.ModelAdmin): fieldsets = ( (None, { 'fields': ('url', 'title', 'content', 'sites') }), ('Advanced options', { 'classes': ('collapse',), 'fields': ('registration_required', 'template_name'), }), )
Hasil dalam halaman admin yang kelihatan seperti:
Jika tidak ada pilihan
fieldsetsmaupunfieldshadir, Django akan mengawalkan ke menampilkan setiap bidang yang bukan sebuahAutoFielddan mempunyaieditable=True, dalam fieldset tunggal, di urutan sama seperti bidang-bidang ditentukan di modelKamus
field_optionsdapat mempunyai kunci berikut:fieldsSebuah tuple dari nama-nama bidang untuk ditampilkan di fieldset ini. Kunci ini diwajibkan.
Contoh:
{ 'fields': ('first_name', 'last_name', 'address', 'city', 'state'), }
Seperti pilihan
fields, untuk memperlihatkan banyak bidang pada baris sama, membungkus bidang tersebut di tuple mereka sendiri. Dalam contoh ini, bidangfirst_namedanlast_namememperlihatkan pada baris sama:{ 'fields': (('first_name', 'last_name'), 'address', 'city', 'state'), }
fieldsdapat mengandung nilai-nilai ditentukan direadonly_fieldsuntuk ditampilkan sebagai hanya-baca.Jika anda menambah nama dari callable ke
fields, aturan sama berlaku seperti pilihanfields: callable harus sidaftar direadonly_fields.
classesSebuah daftar atau tuple mengandung kelas-kelas CSS tambahan untuk berlaku pada fieldset.
Contoh:
{ 'classes': ('wide', 'extrapretty'), }
Dua kelas beguna ditentukan oleh awalan stylesheet situs admin adalah
collapseandwide. Fieldset dengan gayacollapseakan diinisialisasi runtuh di admin dan diganti dengan sebuah tautan "klik untuk memperluas" kecil. Fieldset dengan gayawideakan diberikan ruang mendatar tambahan.
descriptionSebuah string dari teks tambahan pilihan untuk diperlihatkan pada atas dari setiap fieldset, dibawah kepala dari fieldset. String ini tidak dibangun untuk
TabularInlinedisebabkan oleh tata letaknya.Catat bahwa nilai ini bukan pelolosan-HTML ketika itu diperlihatkan dalam antarmuka admin. Ini membuat anda menyertakan HTML jika anda inginkan. Cara lain anda dapat menggunakan teks polos dan
django.utils.html.escape()untuk meloloskan karakter khusus HTML apapun.
-
ModelAdmin.filter_horizontal¶ Secara awalan, sebuah
ManyToManyFielddiperlihatkan di situs admin dengan<select multiple>. Bagaimanapun, kotak pilihan-banyak dapat sulit digunakan ketika memilih banyak barang. Menambahkan sebuahManyToManyFieldke daftar ini malahan akan menggunakan antarmuka "filter" JavaScript tidak mengganggu yang mengizinkan pencarian dalam pilihan. Pilihan tidak terpilih atau terpilih muncul di dua kotak bersebelahan. Lihatfilter_verticaluntuk menggunakan antarmuka tegak lurus.
-
ModelAdmin.filter_vertical¶ Sama seperti
filter_horizontal, tetapi menggunakan tampilan tegak lurus dari antarmuka penyaring dengan kotak dari piliha tidak dipilih muncul diatas dari pilihan terpilih.
-
ModelAdmin.form¶ Secara awalan sebuah
ModelFormsecara dinamis dibuat untuk model anda. Itu digunakan untuk membuat formulir dihadirkan pada kedua halaman tambah/rubah. Anda dapat dengan mudah menyediakanModelFormanda sendiri untuk menimpa awalan perilaku formulir apapun pada halaman tambah/rubah. Kalau tidak, anda dapat menyesuaikan awalan formulir daripada menentukan keseluruhan satu yang baru menggunakan metodeModelAdmin.get_form().Untuk sebuah contoh lihat bagian Menambahkan pengesahan penyesuaian pada admin.
Catatan
Jika anda menentukan atribut
Meta.modelpada sebuahModelForm, anda harus juga menentukan atributMeta.fields(atau atributMeta.exclude). Bagaimanapun, sejak admin mempunyai caranya sendiri dari menentukan bidang-bidang, atributMeta.fieldsakan diabaikan.Jika
ModelFormhanya akan digunakan untuk admin, pemecahan termudah adalah mengilangkan atributMeta.model, sejakModelAdminakan menyediakan model benar untuk digunakan. Kalau tidak, anda dapat menyetelfields = []di kelasMetauntuk memuaskan pengesahan padaModelForm.Catatan
Jika
ModelFormdanModelAdminkedua menentukan sebuah pilihanexcludekemudianModelAdminmengambil mendahului:from django import forms from django.contrib import admin from myapp.models import Person class PersonForm(forms.ModelForm): class Meta: model = Person exclude = ['name'] class PersonAdmin(admin.ModelAdmin): exclude = ['age'] form = PersonForm
Dalam contoh diatas, bidang "age" akan tidak disertakan tetapi bidang "name: akan disertakan di formulir dibangkitkan.
-
ModelAdmin.formfield_overrides¶ Ini menyediakan cara cepat-dan-kotor untuk menimpa beberapa pilihan
Fielduntuk digunakan di admin.formfield_overridesadalah sebuah kamus memetakan sebuah kelas bidang pada kamus dari argumen untuk melewatkan ke bidang pada waktu pembangunan.Sejak itu sedikit abstrak, mari kita lihat contoh nyata. Penggunaan paling umum dari
formfield_overridesada;ah menambahkan sebuah widget penyesuaian untuk jenis tertentu dari bidang. Jadi, bayangkan kami telah menulis sebuahRichTextEditorWidgetyang ingin untuk digunakan untuk bidang teks besar daripada awalan<textarea>. Ini adalah bagaimana kami melakukannya:from django.contrib import admin from django.db import models # Import our custom widget and our model from where they're defined from myapp.models import MyModel from myapp.widgets import RichTextEditorWidget class MyModelAdmin(admin.ModelAdmin): formfield_overrides = { models.TextField: {'widget': RichTextEditorWidget}, }
Catat bahwa kunci di kamus adalah kelas bidang sebenarnya, bukan sebuah string. Nilai adalah kamus lain; argumen ini akan dilewatkan ke metode
__init__()bidang formulir. Lihat The Forms API untuk rincian.Peringatan
If you want to use a custom widget with a relation field (i.e.
ForeignKeyorManyToManyField), make sure you haven't included that field's name inraw_id_fields,radio_fields, orautocomplete_fields.formfield_overrideswon't let you change the widget on relation fields that haveraw_id_fields,radio_fields, orautocomplete_fieldsset. That's becauseraw_id_fields,radio_fields, andautocomplete_fieldsimply custom widgets of their own.
-
ModelAdmin.inlines¶ Lihat
InlineModelAdminobjects below as well asModelAdmin.get_formsets_with_inlines().
-
ModelAdmin.list_display¶ Set
list_displayuntuk mengendalikan bidang-bidang mana yang ditampilkan pada halaman daftar rubah dari admin.Contoh:
list_display = ('first_name', 'last_name')
Jika anda tidak menyetel
list_display, situs admin akan menampilkan kolom tunggal yang menampilkan perwakilan__str__()untuk setiap obyek.Anda mempunyai empat nilai kemungkinan yang dapat digunakan dalam
list_display:Sebuah bidang dari model. Sebagai contoh:
class PersonAdmin(admin.ModelAdmin): list_display = ('first_name', 'last_name')
Sebuah callable yang menerima satu parameter untuk instance model. Sebagai contoh:
def upper_case_name(obj): return ("%s %s" % (obj.first_name, obj.last_name)).upper() upper_case_name.short_description = 'Name' class PersonAdmin(admin.ModelAdmin): list_display = (upper_case_name,)
Deretan karakter mewakilkan sebuah atribut pada
ModelAdmin. Ini berperilaku sama sebagai callable. Sebagai contoh:class PersonAdmin(admin.ModelAdmin): list_display = ('upper_case_name',) def upper_case_name(self, obj): return ("%s %s" % (obj.first_name, obj.last_name)).upper() upper_case_name.short_description = 'Name'
Deretan karakter mewakilkan sebuah atribut pada model. Ini berperilaku hampir sama sebagai callable, tetapi
selfdi konteks ini adalah instance model. Ini adalah contoh model penuh:from django.contrib import admin from django.db import models class Person(models.Model): name = models.CharField(max_length=50) birthday = models.DateField() def decade_born_in(self): return self.birthday.strftime('%Y')[:3] + "0's" decade_born_in.short_description = 'Birth decade' class PersonAdmin(admin.ModelAdmin): list_display = ('name', 'decade_born_in')
Sedikit kasus khusus untuk dicatat tentang
list_display:Jika bidang adalah sebuah
ForeignKey, Django akan menampilkan__str__()dari obyek terkait.Bidang-bidang
ManyToManyFieldtidak didukung, karena akan memerlukan mengerjakan pernyataan SQL terpisah untuk setiap baris di tabel. Jika anda ingin melakukan ini meskipun begitu, berikan model anda sebuah metode penyesuaian, dan tambah nama metode kelist_display. (Lihat dibawah untuk lebih pada metode penyesuaian dilist_display.)Jika bidang adalah sebuah
BooleanFieldatauNullBooleanField, Django akan menampilkan ikon "on" atau "off" cantik daripadaTrueatauFalse.Jika deretan karakter yang diberikan adalah metode dari model,
ModelAdminatau callable, Django akan meloloskan-HTML keluaran secara awalan. Untuk meloloskan masukan pengguna dan mengizinkan etiket tidak meloloskan anda sendiri, gunakanformat_html().Ini adalah sebuah contoh penuh model:
from django.contrib import admin from django.db import models from django.utils.html import format_html class Person(models.Model): first_name = models.CharField(max_length=50) last_name = models.CharField(max_length=50) color_code = models.CharField(max_length=6) def colored_name(self): return format_html( '<span style="color: #{};">{} {}</span>', self.color_code, self.first_name, self.last_name, ) class PersonAdmin(admin.ModelAdmin): list_display = ('first_name', 'last_name', 'colored_name')
Ketika beberapa contoh telah ditunjukkan, ketika menggunakan callable, metode model, atau metode
ModelAdmin, anda dapat menyesuaikan judul kolom dengan menambahkan sebuah atributshort_descriptionpada callable.Jika nilai dari sebuah bidang adalah
None, sebuah string kosong, atau sebuah perulangan tanpa unsur-unsur, Django akan menampilkan -` (tanda garis). Anda dapat menimpa ini denganAdminSite.empty_value_display:from django.contrib import admin admin.site.empty_value_display = '(None)'
Anda juga dapat menggunakan
ModelAdmin.empty_value_display:class PersonAdmin(admin.ModelAdmin): empty_value_display = 'unknown'
Atau pada tingkat bidang:
class PersonAdmin(admin.ModelAdmin): list_display = ('name', 'birth_date_view') def birth_date_view(self, obj): return obj.birth_date birth_date_view.empty_value_display = 'unknown'
If the string given is a method of the model,
ModelAdminor a callable that returns True or False Django will display a pretty "on" or "off" icon if you give the method abooleanattribute whose value isTrue.Ini adalah sebuah contoh penuh model:
from django.contrib import admin from django.db import models class Person(models.Model): first_name = models.CharField(max_length=50) birthday = models.DateField() def born_in_fifties(self): return self.birthday.strftime('%Y')[:3] == '195' born_in_fifties.boolean = True class PersonAdmin(admin.ModelAdmin): list_display = ('name', 'born_in_fifties')
Metode
__str__()adalah hanya sah dalamlist_displayseperti metode model lain apapun, jadi itu sangat OK untuk melakukan ini:list_display = ('__str__', 'some_other_field')
Biasanya, unsur-unsur dari
list_displayyang bukan bidang basisdata sebenarnya tidak dapat digunakan dalam mengurutkan (karena Django melakukan semua pengurutan pada tingkat basisdata).Bagaimanapun, jika sebuah unsur dari
list_displaymewakili bidang basisdata tertentu, anda dapat menunjukkan fakta ini dengan mengatur atributadmin_order_fielddari barang.Sebagai contoh:
from django.contrib import admin from django.db import models from django.utils.html import format_html class Person(models.Model): first_name = models.CharField(max_length=50) color_code = models.CharField(max_length=6) def colored_first_name(self): return format_html( '<span style="color: #{};">{}</span>', self.color_code, self.first_name, ) colored_first_name.admin_order_field = 'first_name' class PersonAdmin(admin.ModelAdmin): list_display = ('first_name', 'colored_first_name')
Diatas akan mengatakan Django untuk mengurutkan berdasarkan bidang
first_nameketika mencoba mengurutkan berdasarkancolored_first_namedi admin.Untuk menunjukkan urutan menurun dengan
admin_order_fieldanda dapat menggunakan awalan tanda penghubung pada nama bidang. Menggunakan contoh diatas, ini akan kelihatan seperti:colored_first_name.admin_order_field = '-first_name'
admin_order_fieldmendukung permintaan pencarian untuk mengurutkan berdasarkan nilai pada hubungan terkait. Contoh ini termasuk sebuah kolom "author first name" di daftar tampilan dan mengizinkan mengurutkan itu dengan nama pertama:class Blog(models.Model): title = models.CharField(max_length=255) author = models.ForeignKey(Person, on_delete=models.CASCADE) class BlogAdmin(admin.ModelAdmin): list_display = ('title', 'author', 'author_first_name') def author_first_name(self, obj): return obj.author.first_name author_first_name.admin_order_field = 'author__first_name'
Unsur-unsur dari
list_displaydapat juga berupa sifat. Harap catat bagaimanapun, bahwa kerena cara sifat bekerja di Python, pengaturanshort_descriptionpada sebuah sifat hanya memungkinkan ketika menggunakan fungsiproperty()dan tidak dengan penghias@property.Sebagai contoh:
class Person(models.Model): first_name = models.CharField(max_length=50) last_name = models.CharField(max_length=50) def my_property(self): return self.first_name + ' ' + self.last_name my_property.short_description = "Full name of the person" full_name = property(my_property) class PersonAdmin(admin.ModelAdmin): list_display = ('full_name',)
Nama-nama bidang di
list_displayakan juga muncul sebagai kelas-kelas CSS di keluaran HTML, di formulir daricolumn-<field_name>pada setiap unsur<th>. Ini dapat digunakan menyetel lebar kolom di sebuah berkas CSS sebagai contoh.Django akan mencoba mentafsirkan setiap unsur dari
list_displaydi urutan ini:- Bidang dari model.
- Callable
- Sebuah string mewakili sebuah atribut
ModelAdmin. - Sebuah string mewakili sebuah atribut model.
Sebagai contoh jika anda mempunyai "first name" sebagai model bidang dan sebagai atribut
ModelAdmin, bidang model akan digunakan.
-
ModelAdmin.list_display_links¶ Gunakan
list_display_linksuntuk mengendalikan jika dan bidang-bidang mana dilist_displayharus di tautkan ke halaman "change" untuk sebuah obyek.Secara awalan, halaman daftar rubah akan mengkaitkan kolom pertama -- bidang pertama ditentukan di
list_display-- ke halaman perubahan untuk setiap barang. Tetapilist_display_linksmembiarkan anda merubah ini:Sete itu menjadi
Noneuntuk tidak mendapatkan tautan sama sekali.Set itu menjadi daftar atau tuple dari bidang (di bentuk sama seperti
list_display) yang kolomnya anda ingin rubah menjadi tautan.Anda dapat menentukan satu atau banyak bidang. Selama bidang-bidang muncul di
list_display, Django tidak peduli seberapa banyak (seberapa sedikit) bidang-bidang ditautkan. Persyaratan satu-satunya adalah bahwa jika anda ingin menggunakanlist_display_linksdengan cara ini, anda harus menentukanlist_display.
Di contoh ini, bidang
first_namedanlast_nameakan dikaitkan pada halaman daftar rubah:class PersonAdmin(admin.ModelAdmin): list_display = ('first_name', 'last_name', 'birthday') list_display_links = ('first_name', 'last_name')
Di contoh ini, jaring halaman daftar rubah tidak akan mempunyai tautan:
class AuditEntryAdmin(admin.ModelAdmin): list_display = ('timestamp', 'message') list_display_links = None
-
ModelAdmin.list_editable¶ Setel
list_editableke sebuah daftar nama-nama bidang pada model yang akan mengizinkan menyunting pada halaman daftar rubah. yaitu, bidang-bidang terdaftar dilist_editableakan diperlihatkan sebagai formulir widget pada halaman daftar rubah, mengizinkan pengguna menyunting dan menyimpan banyak baris sekaligus.Catatan
list_editableberinteraksi dengan sepasang dari pilihan lain di cara tertentu; anda harus mencatat peraturan-peraturan berikut:- Bidang apapun di
list_editableharus juga berada dilist_display. Anda tidak dapat menyunting sebuah bidang yang tidak diperlihatkan! - Bidang sama tidak dapat didaftarkan di kedua
list_editabledanlist_display_links-- sebuah bidang tidak dapat keduanya sebuah formulir dan sebuah tautan.
Anda akan mendapatkan sebuah kesalahan pengesahan jika antara peraturan-peraturan ini rusak.
- Bidang apapun di
-
ModelAdmin.list_filter¶ Setel
list_filteruntuk mengaktifkan penyaring di batang sisi kanan dari halaman daftar rubah dari admin, seperti digambarkan di tangkapan layar berikut:
list_filterharus berupa sebuah daftar atau tuple dari unsur, dimana setiap unsur harus berupa satu dari jenis-jenis berikut:sebuah nama bidang, dimana bidang ditentukan harus berupa antara
BooleanField,CharField,DateField,DateTimeField,IntegerField,ForeignKeyatauManyToManyField, sebagai contoh:class PersonAdmin(admin.ModelAdmin): list_filter = ('is_staff', 'company')
Nama-nama bidang di
list_filterdapat juga menjangkau hubungan menggunakan pencarian__, sebagai contoh:class PersonAdmin(admin.UserAdmin): list_filter = ('company__name',)
sebuah kelas mewarisi dari
django.contrib.admin.SimpleListFilter, yang anda butuh menyediakan atributtitledanparameter_namedan menimpa metodelookupsdanqueryset, sebagai contoh:from datetime import date from django.contrib import admin from django.utils.translation import gettext_lazy as _ class DecadeBornListFilter(admin.SimpleListFilter): # Human-readable title which will be displayed in the # right admin sidebar just above the filter options. title = _('decade born') # Parameter for the filter that will be used in the URL query. parameter_name = 'decade' def lookups(self, request, model_admin): """ Returns a list of tuples. The first element in each tuple is the coded value for the option that will appear in the URL query. The second element is the human-readable name for the option that will appear in the right sidebar. """ return ( ('80s', _('in the eighties')), ('90s', _('in the nineties')), ) def queryset(self, request, queryset): """ Returns the filtered queryset based on the value provided in the query string and retrievable via `self.value()`. """ # Compare the requested value (either '80s' or '90s') # to decide how to filter the queryset. if self.value() == '80s': return queryset.filter(birthday__gte=date(1980, 1, 1), birthday__lte=date(1989, 12, 31)) if self.value() == '90s': return queryset.filter(birthday__gte=date(1990, 1, 1), birthday__lte=date(1999, 12, 31)) class PersonAdmin(admin.ModelAdmin): list_filter = (DecadeBornListFilter,)
Catatan
Sebagai kenyamanan, obyek
HttpRequestdilewatkan ke metodelookupsdanqueryset, sebagai contoh:class AuthDecadeBornListFilter(DecadeBornListFilter): def lookups(self, request, model_admin): if request.user.is_superuser: return super().lookups(request, model_admin) def queryset(self, request, queryset): if request.user.is_superuser: return super().queryset(request, queryset)
Juga sebagai sebuah kenyamanan, obyek
ModelAdmindilewatkan ke metodelookups, sebagai contoh jika anda ingin mendasarkan pencarian pada data tersedia:class AdvancedDecadeBornListFilter(DecadeBornListFilter): def lookups(self, request, model_admin): """ Only show the lookups if there actually is anyone born in the corresponding decades. """ qs = model_admin.get_queryset(request) if qs.filter(birthday__gte=date(1980, 1, 1), birthday__lte=date(1989, 12, 31)).exists(): yield ('80s', _('in the eighties')) if qs.filter(birthday__gte=date(1990, 1, 1), birthday__lte=date(1999, 12, 31)).exists(): yield ('90s', _('in the nineties'))
sebuah tuple, dimana unsur pertama adalah nama bidang dan unsur kedua adalah kelas diwarisi dari
django.contrib.admin.FieldListFilter, sebagai contoh:class PersonAdmin(admin.ModelAdmin): list_filter = ( ('is_staff', admin.BooleanFieldListFilter), )
Anda dapat membatasi pilihan dari model terkait pada obyek-obyek terlibat di hubungan itu menggunakan
RelatedOnlyFieldListFilter:class BookAdmin(admin.ModelAdmin): list_filter = ( ('author', admin.RelatedOnlyFieldListFilter), )
Mengganggap
authoradalahForeignKeypada modelUser, ini akan membatasi pilihanlist_filterpada pengguna yang telah menulis sebuah buku daripada mendaftarkan semua pengguna.Catatan
API
FieldListFilterdianggap internal dan mungkin berubah.
Daftar penyaring khususnya muncul hanya jika penyaring mempunyai lebih dari satu pilihan. Sebuah metode
has_output()penyaring mengendalikan apakah atau tidak itu muncul.Itu memungkinkan menentukan penyesuaian cetakan untuk membangun daftar penyaring:
class FilterWithCustomTemplate(admin.SimpleListFilter): template = "custom_template.html"
Lihat cetakan awalan disediakan oleh Django (
admin/filter.html) untuk contoh nyata.
-
ModelAdmin.list_max_show_all¶ Setel
list_max_show_alluntuk mengendalikan seberapa banyak barang dapat muncul pada halaman daftar rubah admin "Show all". Admin akan memperlihatkan sebuah tautan "Show all" pada daftar rubah hanya jika jumlah hasil perhitungan kurang dari atau sama pada pengaturan ini. Secara awalan, ini disetel menjadi200.
-
ModelAdmin.list_per_page¶ Setel
list_per_pageuntuk mengendalikan seberapa banyak barang akan muncul pada setiap penomoran halaman daftar rubah admin. Secara awalan, ini disetel menjadi100.
Setel
list_select_relateduntuk memberitahu Django menggunakanselect_related()dalam mengambil daftar dari obyek-obyek pada halaman daftar rubah admin. Ini dapat menghemat anda sekelompok dari permintaan basisdata.Nilai harus antara sebuah boolean, sebuah daftar atau sebuah tuple. Awalan adalah
False.Ketika nilai adalah
True,select_related()akan selalu dipanggil. Ketika nilai disetel menjadiFalse, Django akan mencarilist_displaydan memanggilselect_related()jikaForeignKeyapapun hadir.Jika anda butuh lebih kendali berjaring-halus, gunakan sebuah tuple (atau daftar) sebagai nilai untuk
list_select_related. Tuple kosong akan mencegah Django dari memanggilselect_relatedsama sekali. Tuple lain apapun akan dilewatkan secara langsung keselect_relatedsebagai parameter. Sebagai contoh:class ArticleAdmin(admin.ModelAdmin): list_select_related = ('author', 'category')
akan memanggil
select_related('author', 'category').Jika anda butuh menentukan nilai dinamis berdasarkan pada permintaan, anda dapat menerapkan cara
get_list_select_related().
-
ModelAdmin.ordering¶ Setel
orderinguntuk menentukan bagaimana daftar dari obyek-obyek harus diurutkan di tampilan admin Django. Ini harus berupa sebuah daftar atau tuple di bentuk sama seperti parameterorderingmodel.Jika ini tidak disediakan, admin Django akan menggunakan pengurutan awalan model.
Jika anda butuh menentukan urutan dinamis (sebagai contoh bergantung pada pengguna atau bahasa) anda dapat menerapkan sebuah metode
get_ordering().
-
ModelAdmin.paginator¶ Kelas penomoran digunakan untuk menomorkan halaman. Secara awalan,
django.core.paginator.Paginatordigunakan. Jika penyesuaian kelas penomoran tidak mempunyai antarmuka pembangun sama sepertidjango.core.paginator.Paginator, anda akan juga butuh menyediakan sebuah penerapan untukModelAdmin.get_paginator().
-
ModelAdmin.prepopulated_fields¶ Setel
prepopulated_fieldspada nama-nama bidang pemetaan kamus ke bidang-bidang itu harus mengisi dimuka dari:class ArticleAdmin(admin.ModelAdmin): prepopulated_fields = {"slug": ("title",)}
When set, the given fields will use a bit of JavaScript to populate from the fields assigned. The main use for this functionality is to automatically generate the value for
SlugFieldfields from one or more other fields. The generated value is produced by concatenating the values of the source fields, and then by transforming that result into a valid slug (e.g. substituting dashes for spaces; lowercasing ASCII letters; and removing various English stop words such as 'a', 'an', 'as', and similar).Fields are prepopulated on add forms but not on change forms. It's usually undesired that slugs change after an object is created (which would cause an object's URL to change if the slug is used in it).
prepopulated_fieldstidak menerima bidang-bidangDateTimeField,ForeignKey,OneToOneField, danManyToManyField.
-
ModelAdmin.preserve_filters¶ Admin sekarang menjaga penyaring pada daftar tampilan setelah membuat, menyunting atau menghapus sebuah obyek. Anda dapat menyimpan kembali perilaku sebelumnya dari membersihkan penyaring dengan mengatur atribut ini menjadi
False.
-
ModelAdmin.radio_fields¶ Secara awalan, admin Django menggunakan antarmuka kotak-pilih (<select>) untuk bidang-bidang adalah
ForeignKeyatau mempunyaichoicesdisetel. Jika sebuah bidang hadir diradio_fields, Django akan menggunakan antarmuka tombl-radio sebagai gantinya. Menganggapgroupadalah sebuahForeignKeypada modelPerson:class PersonAdmin(admin.ModelAdmin): radio_fields = {"group": admin.VERTICAL}
Anda mempunyai pilihan dari menggunakan
HORIZONTALatauVERTICALdari moduldjango.contrib.admin.Jangan menyertakan sebuah bidang dalam
radio_fieldsmeskipun dia adalahForeignKeyatau mempunyai kumpulanchoices.
-
ModelAdmin.autocomplete_fields¶ - New in Django 2.0.
autocomplete_fieldsis a list ofForeignKeyand/orManyToManyFieldfields you would like to change to Select2 autocomplete inputs.By default, the admin uses a select-box interface (
<select>) for those fields. Sometimes you don't want to incur the overhead of selecting all the related instances to display in the dropdown.The Select2 input looks similar to the default input but comes with a search feature that loads the options asynchronously. This is faster and more user-friendly if the related model has many instances.
Anda harus menentukan
search_fieldsdi obyekModelAdminterkait karena pencarian lengkap otomatis menggunakan itu.Ordering and pagination of the results are controlled by the related
ModelAdmin'sget_ordering()andget_paginator()methods.In the following example,
ChoiceAdminhas an autocomplete field for theForeignKeyto theQuestion. The results are filtered by thequestion_textfield and ordered by thedate_createdfield:class QuestionAdmin(admin.ModelAdmin): ordering = ['date_created'] search_fields = ['question_text'] class ChoiceAdmin(admin.ModelAdmin): autocomplete_fields = ['question']
Performance considerations for large datasets
Ordering using
ModelAdmin.orderingmay cause performance problems as sorting on a large queryset will be slow.Also, if your search fields include fields that aren't indexed by the database, you might encounter poor performance on extremely large tables.
For those cases, it's a good idea to write your own
ModelAdmin.get_search_results()implementation using a full-text indexed search.You may also want to change the
Paginatoron very large tables as the default paginator always performs acount()query. For example, you could override the default implementation of thePaginator.countproperty.
-
ModelAdmin.raw_id_fields¶ Secara awalan, admin Django menggunakan antarmuka kotak-pilih (<select>) untuk bidang-bidang adalah
ForeignKey. Terkadang anda tidak ingin mendatangkan atas dari memiliki untuk memilih semua instance terkait untuk memperlihatkan di drop-down.raw_id_fieldsadalah sebuah daftar dari bidang anda ingin rubah menjadi widgetinputuntuk antara sebuahForeignKeyatauManyToManyField:class ArticleAdmin(admin.ModelAdmin): raw_id_fields = ("newspaper",)
Widget
Inputraw_id_fieldsharus mengandung sebuah primary key jika bidang adalah sebuahForeignKeyatau sebuah dipisahkan koma daftar dari nilai-nilai jika bidng adalahManyToManyField. Widgetraw_id_fieldsmenunjukkan tombol kaca pembesar dekat pada bidang yang mengizinkan pengguna mencari dan memilih sebuah nilai:
-
ModelAdmin.readonly_fields¶ Secara awalan admin menunjukkan semua bidang sebagai dapat disunting. Bidang-bidang apapun di pilihan ini (yang harus berupa sebuah
listatautuple) akan menampilkan data dengan-adanya dan bukan-dapat disunting; mereka juga dikeluarkan dariModelFormdigunakan untuk membuat dan menyunting. catat bahwa ketika menentukanModelAdmin.fieldsatauModelAdmin.fieldsetsbidang-bidang hanya-baca harus hadir untuk ditunjukkan (mereka diabaikan sebaliknya).Jika
readonly_fieldsdigunakan tanpa menentukan urutan jelas melaluiModelAdmin.fieldsatauModelAdmin.fieldsetsmereka akan ditambahkan setelah semua bidang dapat disunting.Sebuah bidang hanya-baca tidak hanya dapat menampilkan data dari bidang model, itu juga dapat memperlihatkan keluaran dari metode model atau metode dari kelas
ModelAdminitu sendiri. Ini sangat mirip pada cara perilakuModelAdmin.list_display. ini menyediakan sebuah cara mudah untuk menggunakan antarmuka admin untuk menyediakan umpan balik pada keadaan dari obyek-obyek sedang disunting, sebagai contoh:from django.contrib import admin from django.utils.html import format_html_join from django.utils.safestring import mark_safe class PersonAdmin(admin.ModelAdmin): readonly_fields = ('address_report',) def address_report(self, instance): # assuming get_full_address() returns a list of strings # for each line of the address and you want to separate each # line by a linebreak return format_html_join( mark_safe('<br/>'), '{}', ((line,) for line in instance.get_full_address()), ) or mark_safe("<span class='errors'>I can't determine this address.</span>") # short_description functions like a model field's verbose_name address_report.short_description = "Address"
-
ModelAdmin.save_as¶ Setel
save_asuntuk mengadakan sebuah fitur "save as new" pada formulir rubah admin.Biasanya, obyek-obyek mempunyai tiga pilihan simpan: "Save", "Save and continue editing", dan "Save and add another". Jika
save_asadalahTrue, "Save and add another" akan diganti oleh sebuah tombol "Save as new" yang membuat sebuah obyek baru (dengan sebuah ID baru) daripada memperbaharui obyek yang ada.Secara awal,
save_asdisetel keFalse.
-
ModelAdmin.save_as_continue¶ Ketika
save_as=True, awalan pengalihan setelah menyimpan obyek baru adalah merubah tampilan untuk obyek itu. Jika anda menyetelsave_as_continue=False, pengalihan akan ke tampilan daftar rubah.Secara awal,
save_as_continuedisetel menjadiFalse.
-
ModelAdmin.save_on_top¶ Setel
save_on_topuntuk menambah tombol simpan lintas atas dari formulir rubah admin anda.Biasanya, tombol simpan muncul hanya pada bawah dari formulir. Jika anda menyetel
save_on_top, tombol-tombol akan muncul kedua pada atas dan bawah.Secara awal,
save_on_topdisetel keFalse.
-
ModelAdmin.search_fields¶ Setel
search_fieldsuntuk mengadakan sebah kotak pencarian pada halaman daftar rubah admin. Ini harus disetel ke sebuah daftar dari nama-nama bidang yang akan dicari kapanpun seseorang mengajukan permintaan pencarian di kotak teks itu.Bidang-bidang ini harus ada semacam bidang teks, seperti
CharFieldatauTextField. Anda dapat juga melakukan pencarian terkait pada sebuahForeignKeyatauManyToManyFieldcatatan "follow" dengan API pencarian:search_fields = ['foreign_key__related_fieldname']
Sebagai contoh, jika anda mempunyai sebuah masukan blog dengan sebuah penulis, pengertian berikut akan mengadakan pencarian masukan blog berdasarkan alamat surel dari penulis.
search_fields = ['user__email']
Ketika seseorang melakukan sebuah pencarian di kotak pencarian admin, Django membagi permintaan pencarian menjadi kata-kata dan mengembalikan semua obyek yang mengandung setiap kata-kata, huruf tidak sensitif, dimana setiap kata harus setidaknya satu dari
search_fields. Sebagai contoh, jikasearch_fieldsdisetel menjadi['first_name', 'last_name']dan pengguna mencarijohn lennon, Django akan melakukan setara dari kalusaWHERESQL ini:WHERE (first_name ILIKE '%john%' OR last_name ILIKE '%john%') AND (first_name ILIKE '%lennon%' OR last_name ILIKE '%lennon%')
Untuk tercepat dan/atau pencarian lebih ketak, awalan nama bidang dengan sebuah penghubung:
^Gunakan penghubung '^' untuk mencocokkan permulaan pada awalan dari bidang. Sebagai contoh jika
search_fieldsdisetel menjadi['^first_name', '^last_name']dan pengguna mencari untukjohn lennon, Django akan melakukan setara dari klausaWHERESQL ini:WHERE (first_name ILIKE 'john%' OR last_name ILIKE 'john%') AND (first_name ILIKE 'lennon%' OR last_name ILIKE 'lennon%')
Permintaan ini lebih efesien daripada permintaan
'%john%'biasa, karena basisdata hanya butuh memeriksa permulaan dari sebuah data kolom, daripada mencari melalui keseluruhan data kolom. Ditambah, jika kolom mempunyai sebuah indeks pada nya, beberapa basisdata mungkin dapat menggunakan indeks untuk permintaan ini, meskipun itu adalah sebuah permintaanLIKE.=Gunakan penghubung '=' untuk pencocokan tepat kasus-tidak sensitif. Sebagai contoh jika
search_fieldsdisetel menjadi`['=first_name', '=last_name']dan pengguna mencari untukjohn lennon, Django akan melakukan setara dari klausaWHERESQL ini:WHERE (first_name ILIKE 'john' OR last_name ILIKE 'john') AND (first_name ILIKE 'lennon' OR last_name ILIKE 'lennon')
Catat bahwa masukan permintaan dipisah oleh ruang, jadi, ikuti contoh ini, itu saat ini tidak memungkinkan mencari semua rekaman yang
first_nameadalah persis'john winston'(mengandung sebuah ruang).@- Menggunakan penghubung '@' untuk melakukan pencocokan teks penuh. Ini seperti metode pencarian awalan tetapi menggunakan sebuah indeks. Saat ini ini hanya tersedia untuk MySQL.
Jika anda butuh menyesuaikan pencarian anda dapat menggunakan
ModelAdmin.get_search_results()untuk menyediakan tambahan atau pengganti perilaku pencarian.
-
ModelAdmin.show_full_result_count¶ Setel
show_full_result_countuntuk mengendalikan apakah perhitungan penuh dari obyek harus ditampilkan pada halaman admin disaring (sebagai contoh99 hasil (jumlah 103)). Jika pilihan ini disetel menjadiFalse, sebuah teks seperti99 hasil (Tampilkan semua)ditampilkan sebagai gantinya.Awalan dari
show_full_result_count=Truemembangkitkan sebuah permintaan untuk melakukan perhitungan penuh pada tabel yang dapat mahal jika isi tabel mengandung sejumlah nomor dari baris.
-
ModelAdmin.view_on_site¶ Setel
view_on_siteuntuk mengendalikan apakah atau tidak ditampilkan tautan "View on site". Tautan ini harus membawa anda ke URL dimana anda dapat menampilkan obyek tersimpan.Nilai ini dapat berupa baik bendera boolean atau callable. Jika
True(awalan), metode obyekget_absolute_url()akan digunakan untuk membangkitkan url.Jika model anda mempunyai metode
get_absolute_url()tetapi anda tidak ingin tombol "View on site" muncul, anda hanya butuh mensetelview_on_sitemenjadiFalse:from django.contrib import admin class PersonAdmin(admin.ModelAdmin): view_on_site = False
Di kasus itu adalah callable, itu menerima instance model sebagai parameter. Sebagi contoh:
from django.contrib import admin from django.urls import reverse class PersonAdmin(admin.ModelAdmin): def view_on_site(self, obj): url = reverse('person-detail', kwargs={'slug': obj.slug}) return 'https://example.com' + url
Penyesuaian pilihan cetakan¶
Bagian Menimpa cetakan admin menggambarkan bagaimana menimpa atau memperpanjang awalan cetakan admin. Gunakan pilihan berikut untuk mengesampingkan cetakan awalan digunakan oleh tampilan ModelAdmin:
-
ModelAdmin.add_form_template¶ Jalur pada cetakan penyesuaian, digunakan oleh
add_view().
-
ModelAdmin.change_form_template¶ Jalur untuk cetakan penyesuaian, digunakan oleh
change_view().
-
ModelAdmin.change_list_template¶ Jalur pada cetakan penyesuaian, digunakan oleh
changelist_view().
-
ModelAdmin.delete_confirmation_template¶ Jalur pada cetakan penyesuaian, digunakan oleh
delete_view()untuk menampilkan halaman penegasan ketika menghapus satu atau lebih obyek.
-
ModelAdmin.delete_selected_confirmation_template¶ Jalur pada cetakan penyesuaian, digunakan oleh tindakan
delete_selecteduntuk memperlihatkan halaman penegasan ketika menghapus satu atau lebih obyek. Lihat actions documentation.
-
ModelAdmin.object_history_template¶ Jalur pada cetakan penyesuaian, digunakan oleh
history_view().
-
ModelAdmin.popup_response_template¶ - New in Django 1.11.
Jalur pada cetakan penyesuaian, digunakan oleh
response_add(),response_change(), danresponse_delete().
Cara ModelAdmin¶
Peringatan
Ketika menimpa ModelAdmin.save_model() dan ModelAdmin.delete_model(), kode anda harus simpan/hapus obyek. Mereka tidak berarti untuk tujuan melarang, daripada mereka mengizinkan anda melakukan tindakan tambahan.
-
ModelAdmin.save_model(request, obj, form, change)[sumber]¶ Metode
save_modelmemberikanHttpRequest, sebuah instance model, sebuah instanceModelForm, dan sebuah nilai boolean berdasarkan pada apakah itu sedang menambahkan atau merubah obyek. Menimpa metode ini mengizinkan melakukan tindakan pra- atau menempatkan-simpan. Memanggilsuper().save_model()untuk menyimpan obyek menggunakanModel.save().Sebagai contoh untuk melampirkan
request.userpada obyek sebelum menyimpannya:from django.contrib import admin class ArticleAdmin(admin.ModelAdmin): def save_model(self, request, obj, form, change): obj.user = request.user super().save_model(request, obj, form, change)
-
ModelAdmin.delete_model(request, obj)[sumber]¶ Metode
delete_modeldiberikanHttpRequestdan sebuah instance model. Mengesampingkan metode ini mengizinkan melakukan tindakan menghapus pra- atau pasca-. Panggilsuper().delete_model()untuk menghapus obyek menggunakanModel.delete().
-
ModelAdmin.save_formset(request, form, formset, change)[sumber]¶ Metode
save_formsetmemberikanHttpRequest, instanceModelForminduk dan nilai boolean berdasarkan pada apakah itu sedang menambahkan atau merubah obyek induk.Sebagai contoh, untuk melampirkan
request.userpada setiap instance model formset dirubah:class ArticleAdmin(admin.ModelAdmin): def save_formset(self, request, form, formset, change): instances = formset.save(commit=False) for obj in formset.deleted_objects: obj.delete() for instance in instances: instance.user = request.user instance.save() formset.save_m2m()
Lihat juga Saving objects in the formset.
-
ModelAdmin.get_ordering(request)¶ Metode
get_orderingmengambilrequestsebagai parameter dan diharapkan mengembalikan sebuahlistatautupleuntuk mengurutkan mirip pada atributordering. Sebagai contoh:class PersonAdmin(admin.ModelAdmin): def get_ordering(self, request): if request.user.is_superuser: return ['name', 'rank'] else: return ['name']
-
ModelAdmin.get_search_results(request, queryset, search_term)[sumber]¶ Metode
get_search_resultsmerubah daftar dari obyek-obyek diperlihatkan kedalam itu yang cocok istilah pencarian disediakan. Itu menerima permintaan, sebuah queryset yang memberlakukan penyaring saat ini, dan istilah pencarian disediakan-pengguna. Itu mengembalikan sebuah tuple mengandung sebuah queryset dirubah untuk menerapkan pencarian, dan sebuah boolean mengindikasikan jika hasil mungkin mengandung ganda.Pencarian penerapan awalan bidang-bidang bernama di
ModelAdmin.search_fields.Metode ini mungkin dikesampingkan dengan metode pencarian penyesuaian anda sendiri. Sebagai contoh, anda mungkin berharap mencari sebuah bidang integer, atau gunakan alat tambahan seperti Solr atau Haystack. Anda harus membangun jika perubahan queryset diterapkan dengan metode pencarian anda mungkin memperkenalkan ganda kedalam hasil, dan mengembalikan
Truedi unsur kedua dari nilai kembalian.Sebagai contoh, untuk mencari
namedanage, anda dapat menggunakan:class PersonAdmin(admin.ModelAdmin): list_display = ('name', 'age') search_fields = ('name',) def get_search_results(self, request, queryset, search_term): queryset, use_distinct = super().get_search_results(request, queryset, search_term) try: search_term_as_int = int(search_term) except ValueError: pass else: queryset |= self.model.objects.filter(age=search_term_as_int) return queryset, use_distinct
Penerapan ini lebih efesien dari
search_fields = ('name', '=age')yang menghasilkan dalam sebuah perbandingan string untuk bidang numerik, sebagai contoh... OR UPPER("polls_choice"."votes"::text) = UPPER('4')pada PostgreSQL.
Metode
save_relatedmemberikanHttpRequest, sebuah instanceModelForminduk, daftar dari formset berderet dan sebuah nilai boolean berdasarkan pada apakah induk sedang ditambahkan atau dirubah. Disini anda dapat melakukan tindakan pra- atau pasca- untuk obyek-obyek terkait ke induk. Catat bahwa pada titik ini obyek induk dan formulirnya telah disimpan.
-
ModelAdmin.get_autocomplete_fields(request)¶ - New in Django 2.0.
The
get_autocomplete_fields()method is given theHttpRequestand is expected to return alistortupleof field names that will be displayed with an autocomplete widget as described above in theModelAdmin.autocomplete_fieldssection.
-
ModelAdmin.get_readonly_fields(request, obj=None)¶ Metode
get_readonly_fieldsmemberikanHttpRequestdanobjsedang disunting atauNonepada sebuah formulir tambah) dan diharapkan mengembalikan sebuahlist(atautupledari nama-nama bidang yang akan diperlihatkan sebagai hanya-baca, seperti digambarkan diatas di bagianModelAdmin.readonly_fields.
-
ModelAdmin.get_prepopulated_fields(request, obj=None)¶ Metode
get_prepopulated_fieldsmemberikanHttpRequestdanobjsedang disunting (atauNonepada sebuah formulir tambah) dan diharapkan untuk mengembalikan sebuahdictionary, seperti digambarkan diatas di bagianModelAdmin.prepopulated_fields.
-
ModelAdmin.get_list_display(request)[sumber]¶ Metode
get_list_displaymemberikanHttpRequestdan diharapkan mengembalikan sebuahlistatautupledari nama-nama bidang yang akan diperlihatkan pada tampilan daftar rubah seperti digambarkan diatas di bagianModelAdmin.list_display.
-
ModelAdmin.get_list_display_links(request, list_display)[sumber]¶ Metode
get_list_display_linksmemberikanHttpRequestdanlistatautupledikembalikan olehModelAdmin.get_list_display(). Itu diharapkan mengembalikan antaraNoneatau sebuahlistatautupledari nama-nama bidang pada daftar rubah yang akan ditautkan ke tampilan rubah, seperti digambarkan di bagianModelAdmin.list_display_links.
-
ModelAdmin.get_exclude(request, obj=None)¶ - New in Django 1.11.
Metode
get_excludememberikanHttpRequestdanobjsedang disunting (atauNonepada sebuah formulir tambah) dan diharapkan untuk mengembalikan sebuah daftar dari bidang-bidang, seperti digambarkan diatas di bagianModelAdmin.exclude.
-
ModelAdmin.get_fields(request, obj=None)¶ Metode
get_fieldsmemberikanHttpRequestdanobjsedang disunting (atauNonepada sebuah formulir tambah) dan diharapkan untuk mengembalikan sebuah daftar dari bidang-bidang, seperti digambarkan diatas di bagianModelAdmin.fields.
-
ModelAdmin.get_fieldsets(request, obj=None)¶ Metode
get_fieldsetsmemberikanHttpRequestdanobjsedang disunting atauNonepada sebuah formulir tambah) dan diharapkan mengembalikan sebuah daftar dari dua-tuple, dimana setiap dua-tuple mewakili sebuah<fieldset>pada halaman formulir admin, seperti digambarkan diatas di bagianModelAdmin.fieldsets.
-
ModelAdmin.get_list_filter(request)[sumber]¶ Metode
get_list_filtermemberikanHttpRequestdan diharapkan mengembalikan jenis yang sama dari urutan jenis seperti untuk atributlist_filter.
Metode
get_list_select_relatedmemberikanHttpRequestdan harus mengembalikan sebuah boolean atau daftar sepertiModelAdmin.list_select_relatedlakukan.
-
ModelAdmin.get_search_fields(request)[sumber]¶ Metode
get_search_fieldsmemberikanHttpRequestdan diharapkan mengembalikan jenis yang sama dari urutan jenis seperti untuk atributsearch_fields.
-
ModelAdmin.get_inline_instances(request, obj=None)[sumber]¶ Metode
get_inline_instancesmemberikanHttpRequestdanobjsedang disunting (atauNonepada sebuah formulir tambah) dan diharapkan mengembalikan sebuahlistatautupledari obyekInlineModelAdmin, seperti digambarkan dibawah di bagianInlineModelAdmin. Sebagai contoh, berikut akan mengembalikan berderet tanpa awalan penyaringan berdasarkan pada perizinan tambah, rubah, dan hapus:class MyModelAdmin(admin.ModelAdmin): inlines = (MyInline,) def get_inline_instances(self, request, obj=None): return [inline(self.model, self.admin_site) for inline in self.inlines]
Jika anda mengutamakan metode ini, pastikan bahwa berderet dikembalikan adalah instance dari kelas-kelas ditentukan di
inlinesatau anda mungkin menghadapi kesalahan "Bad Request" ketika menambahkan obyek-obyek terkait.
-
ModelAdmin.get_urls()[sumber]¶ Metode
get_urlspada sebuahModelAdminmengembalikan URL untuk digunakan untuk ModelAdmin itu di cara yang sama seperti sebuah URLconf. Karena itu anda dapat memperpanjang mereka seperti didokumentasikan di Pengirim URL:from django.contrib import admin from django.template.response import TemplateResponse from django.urls import path class MyModelAdmin(admin.ModelAdmin): def get_urls(self): urls = super().get_urls() my_urls = [ path('my_view/', self.my_view), ] return my_urls + urls def my_view(self, request): # ... context = dict( # Include common variables for rendering the admin template. self.admin_site.each_context(request), # Anything else you want in the context... key=value, ) return TemplateResponse(request, "sometemplate.html", context)
Jika anda ingin menggunakan tata letak admin, perpanjang dari
admin/base_site.html:{% extends "admin/base_site.html" %} {% block content %} ... {% endblock %}
Catatan
Perhatikan bahwa pola penyesuaian disertakan sebelum URL admin biasa: pola URL admin adalah sangat membolehkan dan akan cocok hampir apapun, jadi anda akan biasanya ingin menambahkan URL penyesuaian anda pada satu di siap-pakai.
Di contoj ini,
my_viewakan diakses pada/admin/myapp/mymodel/my_view/(menganggap URL admin disertakan pada/admin/.)Bagaimanapun, fungsi
self.my_viewterdaftar diatas menderita dari dua masalah:- Itu tidak akan melakukan pemeriksaan perizinan apapun, jadi itu akan dapat diakses unutk masyarakat umum.
- Itu tidak akan menyediakan rincian kepala apapun untuk mencegah penyimpanan sementara. Ini berarti jika halaman mengambil data dari basisdata, dan middleware penyimpanan sementara aktid, halaman dapat menampilkan informasi usang.
Sejak ini biasanya bukan apa anda inginkan, Django menyediakan pembungkus kenyamanan untuk memeriksa perizinan dan menandai tampilan sebagai bukan-cacheable. pembungkus ini adalah
AdminSite.admin_view()(i.e.self.admin_site.admin_viewdidalam sebuah instanceModelAdmin); gunakan itu seperti begitu:class MyModelAdmin(admin.ModelAdmin): def get_urls(self): urls = super().get_urls() my_urls = [ path('my_view/', self.admin_site.admin_view(self.my_view)) ] return my_urls + urls
Perhatikan tampilan dibungkus di baris kelima diatas:
path('my_view/', self.admin_site.admin_view(self.my_view))
Pembungkus ini akan melindungi
self.my_viewdari akses tidak terotorisasi dan akan memberlakukan penghiasdjango.views.decorators.cache.never_cache()untuk memastikan itu tidak disimpan sementara jika middleware cache aktif.Jika halaman adalah cacheable, tetapi anda masih ingin pemeriksaan perizinan dilakukan, anda dapat melewatkan sebuah argumen
cacheable=TruepadaAdminSite.admin_view():path('my_view/', self.admin_site.admin_view(self.my_view, cacheable=True))
Tampilan
ModelAdminmempunyai atributmodel_admin. Selain tampilanAdminSitemempunyai atributadmin_site.
-
ModelAdmin.get_form(request, obj=None, **kwargs)[sumber]¶ Mengembalikan sebuah kelas
ModelFormuntuk digunakan di tampilan tambah dan rubah admin, lihatadd_view()danchange_view().Penerapan dasar menggunakan
modelform_factory()pada subkelasform, dirubah oleh atribut sepertifieldsdanexclude. Jadi, sebagai contoh, jika anda ingin menawarkan tambahan bidang-bidang le superuser, anda dapat menukar formulir dasar berbeda seperi begitu:class MyModelAdmin(admin.ModelAdmin): def get_form(self, request, obj=None, **kwargs): if request.user.is_superuser: kwargs['form'] = MySuperuserForm return super().get_form(request, obj, **kwargs)
Anda mungkin juga hanya mengembalikan kelas
ModelFormpenyesuaian langsung.
-
ModelAdmin.get_formsets_with_inlines(request, obj=None)[sumber]¶ Menghasilkan (
FormSet,InlineModelAdmin) pasangan untuk digunakan di tampilan tambah dan rubah admin.Sebagai contoh jika anda ingin memperlihatkan hanya berderet tertentu di tampilan rubah, anda dapat menimpa
get_formsets_with_inlinessebagai berikut:class MyModelAdmin(admin.ModelAdmin): inlines = [MyInline, SomeOtherInline] def get_formsets_with_inlines(self, request, obj=None): for inline in self.get_inline_instances(request, obj): # hide MyInline in the add view if isinstance(inline, MyInline) and obj is None: continue yield inline.get_formset(request, obj), inline
-
ModelAdmin.formfield_for_foreignkey(db_field, request, **kwargs)¶ Metode
formfield_for_foreignkeypada sebuahModelAdminmengizinkan anda menimpa formfield awalan untuk bidang foreign key. Sebagai contoh, untuk mengembalikan bagian dari obyek-obyek untuk bidang foreign key ini berdasarkan pada pengguna:class MyModelAdmin(admin.ModelAdmin): def formfield_for_foreignkey(self, db_field, request, **kwargs): if db_field.name == "car": kwargs["queryset"] = Car.objects.filter(owner=request.user) return super().formfield_for_foreignkey(db_field, request, **kwargs)
Penggunaan ini instance
HttpRequestuntuk menyaring bidang foreign keyCarke hanya meperlihatkan mobil dimiliki oleh instanceUser.
-
ModelAdmin.formfield_for_manytomany(db_field, request, **kwargs)¶ Seperti metode
formfield_for_foreignkey, metodeformfield_for_manytomanydapat dikesampingkan untuk merubah formfield awalan untuk bidang many to many. Sebagai contoh, jika seorang pemilik dapat memiliki banyak mobil dan mobil dapat dimiliki banyak pemilik -- hubungan many to many -- anda dapat penyaring bidang foreign keyCarpada hanya memperlihatkan pemilik mobil berdasarkanUser:class MyModelAdmin(admin.ModelAdmin): def formfield_for_manytomany(self, db_field, request, **kwargs): if db_field.name == "cars": kwargs["queryset"] = Car.objects.filter(owner=request.user) return super().formfield_for_manytomany(db_field, request, **kwargs)
-
ModelAdmin.formfield_for_choice_field(db_field, request, **kwargs)¶ Seperti metode
formfield_for_foreignkeydanformfield_for_manytomany, metodeformfield_for_choice_fielddapat ditimpa untuk merubah formfield awalan untuk sebuah bidang yang telah menyatakan pilihan. Sebagai contoh, jika pilihan tersedia pada superuser harus berbeda dari tersebut tersedia pada staf biasa, anda dapat meneruskan sebagai berikut:class MyModelAdmin(admin.ModelAdmin): def formfield_for_choice_field(self, db_field, request, **kwargs): if db_field.name == "status": kwargs['choices'] = ( ('accepted', 'Accepted'), ('denied', 'Denied'), ) if request.user.is_superuser: kwargs['choices'] += (('ready', 'Ready for deployment'),) return super().formfield_for_choice_field(db_field, request, **kwargs)
Catatan
Setiap kumpulan atribut
choicespada formfield akan dibatasi pada hanya bidang formulir. Jika bidang berhubungan pada model mempunyai kumpulan pilihan, pilihan-pilihan akan disediakan pada formulir harus berupa subkumpulan sah dari pilihan-pilihan tersebut, sebaliknya pengajuan formulir akan gagal dengan sebuahValidationErrorketika model itu sendiri disahkan sebelum disimpan.
-
ModelAdmin.get_changelist(request, **kwargs)[sumber]¶ Mengembalikan kelas
Changelistuntuk digunakan untuk pendaftaran. Secara awalan,django.contrib.admin.views.main.ChangeListdigunakan. Dengan mewarisi kelas ini anda dapat merubah perilaku dari pendaftaran.
-
ModelAdmin.get_changelist_form(request, **kwargs)[sumber]¶ Mengembalikan sebuah kelas
ModelFormuntuk digunakan diFormsetpada halaman daftar rubah. Untuk menggunakan formulir penyesuaian, sebagai contoh:from django import forms class MyForm(forms.ModelForm): pass class MyModelAdmin(admin.ModelAdmin): def get_changelist_form(self, request, **kwargs): return MyForm
Catatan
Jika anda menentukan atribut
Meta.modelpada sebuahModelForm, anda harus juga menentukan atributMeta.fields(atau atributMeta.exclude). Bagaimanapun,ModelAdminmengabaikan nilai ini, menimpa itu dengan atributModelAdmin.list_editable. Pemecahan paling mudah adalah menghilangkan atributMeta.model, sejakModelAdminakan menyediakan model benar untuk digunakan.
-
ModelAdmin.get_changelist_formset(request, **kwargs)[sumber]¶ Mengembalikan sebuah kelas ModelFormSet untuk digunakan pada halaman daftar rubah jika
list_editabledigunakan. Untuk menggunakan formset penyesuaian, sebagai contoh:from django.forms import BaseModelFormSet class MyAdminFormSet(BaseModelFormSet): pass class MyModelAdmin(admin.ModelAdmin): def get_changelist_formset(self, request, **kwargs): kwargs['formset'] = MyAdminFormSet return super().get_changelist_formset(request, **kwargs)
-
ModelAdmin.lookup_allowed(lookup, value)¶ The objects in the changelist page can be filtered with lookups from the URL's query string. This is how
list_filterworks, for example. The lookups are similar to what's used inQuerySet.filter()(e.g.user__email=user@example.com). Since the lookups in the query string can be manipulated by the user, they must be sanitized to prevent unauthorized data exposure.The
lookup_allowed()method is given a lookup path from the query string (e.g.'user__email') and the corresponding value (e.g.'user@example.com'), and returns a boolean indicating whether filtering the changelist'sQuerySetusing the parameters is permitted. Iflookup_allowed()returnsFalse,DisallowedModelAdminLookup(subclass ofSuspiciousOperation) is raised.By default,
lookup_allowed()allows access to a model's local fields, field paths used inlist_filter(but not paths fromget_list_filter()), and lookups required forlimit_choices_toto function correctly inraw_id_fields.Menimpa metode ini utnuk menyesuaikan pencarian diizinkan untuk subkelas
ModelAdminanda.
-
ModelAdmin.has_add_permission(request)¶ Harus mengembalikan
Truejika menambahkan sebuah obyek diizinkan,Falsesebaliknya.
-
ModelAdmin.has_change_permission(request, obj=None)¶ Should return
Trueif editingobjis permitted,Falseotherwise. IfobjisNone, should returnTrueorFalseto indicate whether editing of objects of this type is permitted in general (e.g.,Falsewill be interpreted as meaning that the current user is not permitted to edit any object of this type).
-
ModelAdmin.has_delete_permission(request, obj=None)¶ Should return
Trueif deletingobjis permitted,Falseotherwise. IfobjisNone, should returnTrueorFalseto indicate whether deleting objects of this type is permitted in general (e.g.,Falsewill be interpreted as meaning that the current user is not permitted to delete any object of this type).
-
ModelAdmin.has_module_permission(request)¶ Harus mengembalikan
Truejika memperlihatkan modul pada halaman indeks admin dan mengakses halaman indeks admin diizinkan,Falsesebaliknya. GunakanUser.has_module_perms()secara awalan. Mengutamakan itu tidak membatasi akses untuk menambah, merubah atau menghapus tampilan,has_add_permission(),has_change_permission(), danhas_delete_permission()harus digunakan untuk itu.
-
ModelAdmin.get_queryset(request)¶ Metode
get_querysetpada sebuahModelAdminmengembalikan sebuahQuerySetdari semua instance model yang dapat disunting oleh situs admin. Satu kasus penggunaan dari mengutamakan metode ini adalah menunjukkan obyek-obyek dimiliki oleh pengguna masuk:class MyModelAdmin(admin.ModelAdmin): def get_queryset(self, request): qs = super().get_queryset(request) if request.user.is_superuser: return qs return qs.filter(author=request.user)
-
ModelAdmin.message_user(request, message, level=messages.INFO, extra_tags='', fail_silently=False)[sumber]¶ Mengirim sebuah pesan ke pengguna menggunakan backend
django.contrib.messages. Lihat custom ModelAdmin example.Argumen kata kunci mengizinkan anda merubah tingkatan pesan, menambah tambahan etiket CSS, atau gagal secara diam jika kerangka kerja
contrib.messagestidak dipasang. Argumen kata kunci ini cocok dengan untukdjango.contrib.messages.add_message(), lihat dokumentasi fungsi itu untuk lebih rinci. Satu perbedaan adalah bahwa tingkatan mungkin dilewatkan sebagai label string sebagai tambahan pada integer/ketetapan.
-
ModelAdmin.get_paginator(request, queryset, per_page, orphans=0, allow_empty_first_page=True)[sumber]¶ Mengembalikan sebuah instance dari penomor digunakan untuk tampilan ini. Secara awalan, instasiasi sebuah instance dari
paginator.
-
ModelAdmin.response_add(request, obj, post_url_continue=None)[sumber]¶ Menentukan tahap the
HttpResponsefor theadd_view().response_adddipanggil setelah formulir admin diajukan dan hanya setelah obyek dan semua instances terkait telah dibuat dan disimpan. Anda dapat menimpanya untuk merubah perilaku awalan setelah obyek telah dibuat.
-
ModelAdmin.response_change(request, obj)[sumber]¶ Menentukan tahap
HttpResponsefor thechange_view().response_changedipanggil setelah formulir admin diajukan dan hanya setelah obyek dan semua instances terkait telah disimpan. Anda dapat menimpanya untuk merubah perilaku awalan setelah obyek telah dirubah.
-
ModelAdmin.response_delete(request, obj_display, obj_id)[sumber]¶ Menentukan
HttpResponseuntuk tahapdelete_view().response_deletedipanggil setelah obyek telah dihapus. Anda dapat menimpa ini untuk merubah kebiasaan awal setelah obyek telah dihapus.obj_displayadalah sebuah string dengan nama dari obyek terhapus.obj_idadalah penciri serial digunakan untuk mengambil obyek untuk dihapus.
-
ModelAdmin.get_changeform_initial_data(request)[sumber]¶ Sebuah kaitan untuk data inisial pada formulir rubah admin. Secara awalan, bidang-bidang diberikan nilai-nilai inisial dari parameter
GET. Sebagai contoh,?name=initial_valueakan menyetel nilai inisial bidangnamemenjadiinitial_value.Metode ini harus mengembalikan sebuah kamus di formulir
{'fieldname': 'fieldval'}:def get_changeform_initial_data(self, request): return {'name': 'custom_initial_value'}
Cara lain¶
-
ModelAdmin.add_view(request, form_url='', extra_context=None)[sumber]¶ Tampilan Django untuk halaman tambahan instance model. Lihat catatan dibawah.
-
ModelAdmin.change_view(request, object_id, form_url='', extra_context=None)[sumber]¶ Tampilan Django untuk halaman suntingan instance model. Lihat catatan dibawah.
-
ModelAdmin.changelist_view(request, extra_context=None)[sumber]¶ Tampilan Django untuk halaman daftar rubah/tindakan instance model. Lihat catatan dibawah.
-
ModelAdmin.delete_view(request, object_id, extra_context=None)[sumber]¶ Tampilan Django untuk halaman penegasan penghapusn instance model. Lihat catatan dibawah.
-
ModelAdmin.history_view(request, object_id, extra_context=None)[sumber]¶ Tampilan Django untuk halaman yang menampilan riwayat perubahan untuk instance model diberikan.
Tidak seperti jenis-kait metode ModelAdmin dirinci di bagian sebelumnya, lima metode ini yang pada kenyataannya dirancang untuk dipanggil sebagai tampilan Django dari URL aplikasi admin mengirim penangan untuk membangun halaman-halaman yang berhubungan dengan tindakan CRUD instance-instance model. Sebagai sebuah hasil, slengkapnya mengutamakan metode ini akan secara signifikan merubah perilaku admin aplikasi admin.
Satu alasan umum untuk mengutamakan metode ini adalah menambah data konteks yang disediakan ke cetakan yang membangun tampilan. Di contoh berikut, tamppilan rubah ditimpa sehingga cetakan dibangun menyediakan beberapa data pemetaan tambahan yang tidak akan sebaliknya menjadi tersedia:
class MyModelAdmin(admin.ModelAdmin):
# A template for a very customized change view:
change_form_template = 'admin/myapp/extras/openstreetmap_change_form.html'
def get_osm_info(self):
# ...
pass
def change_view(self, request, object_id, form_url='', extra_context=None):
extra_context = extra_context or {}
extra_context['osm_data'] = self.get_osm_info()
return super().change_view(
request, object_id, form_url, extra_context=extra_context,
)
Tampilan ini mengembalikan instance TemplateResponse yang mengizinkan anda dengan mudah menyesuaikan data tanggapan sebelum membangun. Untuk rincian lebih, lihat TemplateResponse documentation.
Pengertian aset ModelAdmin¶
Ada waktu dimana anda akan menambahkan sedikit CSS dan/atay JavaScript pada tampilan tambah/rubah. Ini dapat dicapai dengan menggunakan kelas Media sebelah dalam pada ModelAdmin anda:
class ArticleAdmin(admin.ModelAdmin):
class Media:
css = {
"all": ("my_styles.css",)
}
js = ("my_code.js",)
staticfiles app menambahkan STATIC_URL (atau MEDIA_URL jika STATIC_URL adalah None) pada jalur aset apapun. Peraturan sama berlaku seperti regular asset definitions on forms.
jQuery¶
JavaScript admin Django memanfaatkan pustaka jQuery
Untuk menghindari pertentangan dengan tulisan dipasok-pengguna atau pustaka, jQuery (versi 2.2.3) Django adalah namespace sebagai django.jQuery. Jika anda ingin menggunakan jQuery di JavaScript admin anda sendiri tanpa menyertakan salinan kedua, anda dapat menggunakan obyek django.jQuery pada daftar rubah dan tampilan tambah/rubah.
Kelas ModelAdmin membutuhkan jQuery secara awalan, jadi tidak butuh menambahkan jQuery ke daftar ModelAdmin anda dari sumber daya media meskipun anda mempunyai kebutuhan khusus. Sebagai contoh, jika anda membutuhkan pustaka jQuery menjadi di namespace global (sebagai contoh ketika menggunakan plugin jQuery pihak-ketiga) atau jika anda butuh versi terbaru dari jQuery, anda akan harus menyertakan salinan anda sendiri.
Django menyediakan kedua versi tidak dipadatkan dan 'dikecilkan' dari jQuery, sebagai masing-masing jquery.js dan jquery.min.js.
ModelAdmin dan InlineModelAdmin mempunyai sebuah sifat media yang mengembalikan sebuah daftar dari obyek Media yang menyimpan jalur pada berkas-berkas JavaScript untuk formulir dan/atau formset. Jika DEBUG adalah True itu akan mengembalikan versi tidak terpampat dari beragam berkas-berkas JavaScript, termasuk jquery.js; jika tidak, itu akan mengembalikan versi 'minified'.
Menambahkan pengesahan penyesuaian pada admin¶
Menambahkan penyesuaian pengesahan dari data di admin adalah sangat mudah. Antarmuka admin otomatis menggunakan kembali django.forms, dan kelas ModelAdmin memberikan anda kemampuan menentukan formulir anda sendiri:
class ArticleAdmin(admin.ModelAdmin):
form = MyArticleAdminForm
MyArticleAdminForm dapat ditentukan dimanapun selama anda mengimpor ketika diperlukan. Sekarang dalam formulir anda anda dapat menambah penyesuaian pengesahan milik anda sendiri untuk bidang apapun:
class MyArticleAdminForm(forms.ModelForm):
def clean_name(self):
# do something that validates your data
return self.cleaned_data["name"]
Itu adalah penting anda menggunakan sebuah ModelForm disini sebaliknya hal-hal dapat rusak. Lihat dokuementasi forms pada custom validation dan, lebih khusus, model form validation notes untuk informasi lebih.
Obyek InlineModelAdmin¶
-
class
InlineModelAdmin¶
-
class
StackedInline[sumber]¶ Antarmuka admin mempunyai kemampuan menyunting model-model pada halaman sama sebagai model induk. Ini adalah dipanggil berderet. Andaikan anda mempunyai kedua model ini:
from django.db import models class Author(models.Model): name = models.CharField(max_length=100) class Book(models.Model): author = models.ForeignKey(Author, on_delete=models.CASCADE) title = models.CharField(max_length=100)
Anda dapat menyunting buku-buku ditulis oleh seorang penulis pada halaman penulis. Anda tambah berderet pada sebuah model dengan menentukan mereka di sebuah
ModelAdmin.inlines:from django.contrib import admin class BookInline(admin.TabularInline): model = Book class AuthorAdmin(admin.ModelAdmin): inlines = [ BookInline, ]
Django menyediakan dua subkelas dari
InlineModelAdmindan mereka adalah:Perbedaan diantara kedua ini adalah hanya cetakan digunakan untuk membangun mereka.
Pilihan InlineModelAdmin¶
InlineModelAdmin berbagi banyak dari fitur-fitur sama seperti ModelAdmin, dan menambahkan beberapa dari miliknya (fitur-fitur dibagi sebenarnya ditentukan di superkelas BaseModelAdmin). Fitur-fitur dibagi adalah:
formfieldsetsfieldsformfield_overridesexcludefilter_horizontalfilter_verticalorderingprepopulated_fieldsget_queryset()radio_fieldsreadonly_fieldsraw_id_fieldsformfield_for_choice_field()formfield_for_foreignkey()formfield_for_manytomany()has_add_permission()has_change_permission()has_delete_permission()has_module_permission()
Kelas InlineModelAdmin menambahkan:
-
InlineModelAdmin.model¶ Model yang di berderet sedang menggunakan. Ini adalah diwajibkan.
-
InlineModelAdmin.fk_name¶ Nama dari foreign key pada model. Di kebanyakan kasus ini akan ditangani dengan otomatis, tetapi
fk_nameharus ditentukan secara jelas jika ada lebih dari satu foreign key pada model induk yang sama.
-
InlineModelAdmin.formset¶ Ini awalan pada
BaseInlineFormSet. Menggunakan formset anda sendiri dapat memberikan anda banyak kemungkinan dari penyesuaian. Berderet adalah dibangun sekitar model formsets.
-
InlineModelAdmin.form¶ NIlai untuk awalan
formpadaModelForm. Ini adalah apa yang dilewatkan melaluiinlineformset_factory()ketika membuat formset untuk berderet ini.
Peringatan
Ketika menulis pengesahan penyesuaian untuk formulir InlineModelAdmin, waspada dari menulis pengesahan yang bergantung pada fitur-fitur dari model induk. Jika model induk gagal mensahkan, itu mungkin ditinggal di keadaan yang tidak konsisten seperti digambarkan di peringatan di Pengesahan pada sebuah ModelForm.
-
InlineModelAdmin.classes¶ Sebuah daftar atau tuple mengandung kelas-kelas CSS tambahan pada fieldset yang dibangun untuk berderet. Awalan pada
None. Ketika dengan kelas-kelas dikonfigurasikan difieldsets, berderet dengan sebuah kelascollapseakan diinisialisasikan diruntuhkan dan kepala mereka akan mempunyai tautan "show" kecil.
-
InlineModelAdmin.extra¶ Ini mengendalikan sejumlah formulir tambahan formset akan diperlihatkan sebagai tambahan pada formulir inisial. Lihat formsets documentation untuk informasi lebih.
Untuk pengguna dengan peramban diadakan-JavaScript, sebuah tautan "Add another" disediakan untuk mengadakan nomor apapun dari berderet tambahan untuk ditambahkan ke itu yang disediakan sebagai sebuah hasil dari argumen
extra.Tautan dinamis tidak akan muncul jika nomor dari formulir diperlihatkan saat ini melebihi
max_num, atau jika pengguna tidak mempunyai JavaScript diadakan.InlineModelAdmin.get_extra()juga mengizinkan anda menyesuaikan sejumlah formulir tambahan.
-
InlineModelAdmin.max_num¶ Ini mengendalikan nomor minimal dari formulir untuk menunjukkan di berderet. Ini tidak secara langsung menghubungankan ke nomor dari obyek, tetapi dapat jika nilai cukup kecil. Lihat Membatasi angka dari obyek dapat di sunting untuk informasi lebih.
InlineModelAdmin.get_max_num()juga mengizinkan anda menyesuaikan nomor maksimal dari formulir tambahan.
-
InlineModelAdmin.min_num¶ Ini mengendalikan nomor minimal dari formulir untuk menunjukkan di berderet. Lihat
modelformset_factory()untuk informasi lebih.InlineModelAdmin.get_min_num()juga mengizinkan anda menyesuaikan nomor minimal dari formulir ditampilkan.
-
InlineModelAdmin.raw_id_fields¶ Secara awalan, admin Django menggunakan antarmuka kotak-pilih (<select>) untuk bidang-bidang adalah
ForeignKey. Terkadang anda tidak ingin mendatangkan atas dari memiliki untuk memilih semua instance terkait untuk memperlihatkan di drop-down.raw_id_fieldsadalah sebuah daftar dari bidang anda ingin rubah menjadi widgetinputuntuk antara sebuahForeignKeyatauManyToManyField:class BookInline(admin.TabularInline): model = Book raw_id_fields = ("pages",)
-
InlineModelAdmin.template¶ Cetakan digunakan untuk membangun berderet pada halaman.
-
InlineModelAdmin.verbose_name¶ Sebuah penimpaan pada
verbose_nameditemukan di kelasMetasebelah dalam model.
-
InlineModelAdmin.verbose_name_plural¶ Sebuah penimpaan pada
verbose_name_pluralditemukan di kelasMetasebelah dalam model.
-
InlineModelAdmin.can_delete¶ Menentukan apakah atau tidak obyek berderet dapat dihapus di berderet. Awalan menjadi
True.
-
InlineModelAdmin.show_change_link¶ Menentukan apakah atau tidak obyek berderet dapat dirubah di admin mempunyai sebuah tautan ke formulir rubah. Awalan menjadi
False.
-
InlineModelAdmin.get_formset(request, obj=None, **kwargs)¶ Mengembalikan sebuah kelas
BaseInlineFormSetuntuk digunakan di tampilan tambah/rubah admin. Lihat contoh untukModelAdmin.get_formsets_with_inlines.
-
InlineModelAdmin.get_extra(request, obj=None, **kwargs)¶ Mengembalikan sejumlah formulir berderet tambahan untuk digunakan. Secara awalan, mengembalikan atribut
InlineModelAdmin.extraTimpa metode ini untuk secara program menentukan nomor dari formulir berderet tambahan. Sebagai contoh, ini mungkin berdasarkan pada instance model (dilewatkan sebagai argumen kata kunci
obj):class BinaryTreeAdmin(admin.TabularInline): model = BinaryTree def get_extra(self, request, obj=None, **kwargs): extra = 2 if obj: return extra - obj.binarytree_set.count() return extra
-
InlineModelAdmin.get_max_num(request, obj=None, **kwargs)¶ Mengembalikan nomor maksimal dari formulir berderet tambahan untuk digunakan. Secara awalan, mengembalikan atribut
InlineModelAdmin.max_num.Timpa metode ini untuk secara program menentukan nomor maksimal dari formulir berderet tambahan. Sebagai contoh, ini mungkin berdasarkan pada instance model (dilewatkan sebagai argumen kata kunci
obj):class BinaryTreeAdmin(admin.TabularInline): model = BinaryTree def get_max_num(self, request, obj=None, **kwargs): max_num = 10 if obj and obj.parent: return max_num - 5 return max_num
-
InlineModelAdmin.get_min_num(request, obj=None, **kwargs)¶ Mengembalikan nomor minimal dari formulir berderet untuk digunakan. Secara awalan, mengembalikan atribut
InlineModelAdmin.min_num.Timpa metode ini untuk secara program menentukan nomor minimal dari formulir berderet tambahan. Sebagai contoh, ini mungkin berdasarkan pada instance model (dilewatkan sebagai argumen kata kunci
obj):
Bekerja dengan sebuah model dengan dua atau lebih foreign key pada model induk yang sama.¶
Itu terkadang memungkinkan memiliki lebih dari satu foreign key pada model yang sama. Ambil model ini sebagai contoh:
from django.db import models
class Friendship(models.Model):
to_person = models.ForeignKey(Person, on_delete=models.CASCADE, related_name="friends")
from_person = models.ForeignKey(Person, on_delete=models.CASCADE, related_name="from_friends")
Jika anda ingin memperlihatkan sebuah berderet pada halaman tambah/rubah admin Person anda butuh secara jelas menentukan foreign key sejak itu tidak dapat melakukannya otomatis:
from django.contrib import admin
from myapp.models import Friendship
class FriendshipInline(admin.TabularInline):
model = Friendship
fk_name = "to_person"
class PersonAdmin(admin.ModelAdmin):
inlines = [
FriendshipInline,
]
Bekerja dengan model banyak-ke-banyak¶
Secara awalan, widget admin untuk hubungan many-to-many akan diperlihatkan pada model manapun mengandung acuan sebenarnya pada ManyToManyField. Tergantung pada pengertian ModelAdmin anda, setiap bidang many-to-many di model anda akan diwakili oleh HTML standar <select multiple>, penyaring mendatar atau tegak lurus, atau sebuah widget raw_id_admin, Bagaimanapun, itu juga memungkinkan mengganti widget-widget ini dengan berderet.
Misalkan kita memiliki model berikut:
from django.db import models
class Person(models.Model):
name = models.CharField(max_length=128)
class Group(models.Model):
name = models.CharField(max_length=128)
members = models.ManyToManyField(Person, related_name='groups')
Jika anda ingin memperlihatkan hubungan many-yo-many menggunakan sebuah berderet, anda dapat melakukan juga dengan menentukan sebuah obyek InlineModelAdmin untuk hubungan:
from django.contrib import admin
class MembershipInline(admin.TabularInline):
model = Group.members.through
class PersonAdmin(admin.ModelAdmin):
inlines = [
MembershipInline,
]
class GroupAdmin(admin.ModelAdmin):
inlines = [
MembershipInline,
]
exclude = ('members',)
Ada dua fitur perlu dicatat di contoh ini.
Pertama-tama - kelas MembershipInline mengacu Group.members.through. Atribut through adalah sebuah acuan pada model yang mengelola hubungan many-to-many. Model ini secara otomatis dibuat oleh Django ketika anda menentukan bidang many-to-many.
Kedua, GroupAdmin harus secara manual mengeluarkan bidang members. Django menampilkan sebuah widget admin untuk bidang many-to-many pada model yang menentukan hubungan (di kasus ini, Group). Jika anda ingin menggunakan sebuah model berderet untuk mewakili hubungan many-to-many, anda harus memberitahu admin Django tidak memperlihatkan widget ini - sebaliknya anda akan berakhir dengan dua widget pada halaman admin anda untuk mengelola hubungan.
Catat bahwa ketika menggunakan teknik ini sinyal m2m_changed tidak dipicu. Ini adalah karena sejauh admin yang bersangkutan, through hanya sebuah model dengan dua bidang foreign key daripada hubungan many-to-many.
Dalam semua hal lainnya, InlineModelAdmin persisnya sama seperti lainnya. Anda dapat menyesuaikan penampilan menggunakan apapun dari sifat-sifat ModelAdmin biasa.
Bekerja dengan model perantara many-to-many¶
Ketika anda menentukan sebuah model perantara menggunakan argumen through pada sebuah ManyToManyField, admin tidak akan menampilkan sebuah widget secara awalan. Ini karena setiap instance dari model perantara membutuhkan lebih informasi dari dapat diperlihatkan dalam sebuah widget tunggal, dan tata letak dibutuhkan untuk widget banyak akan beragam bergantung pada model perantara.
Bagaimanapun, kami masing ingin dapat menyunting informasi itu sebaris. Sayangnya, ini mudah melakukan dengan model admin. Seharusnya kami memiliki model-model berikut:
from django.db import models
class Person(models.Model):
name = models.CharField(max_length=128)
class Group(models.Model):
name = models.CharField(max_length=128)
members = models.ManyToManyField(Person, through='Membership')
class Membership(models.Model):
person = models.ForeignKey(Person, on_delete=models.CASCADE)
group = models.ForeignKey(Group, on_delete=models.CASCADE)
date_joined = models.DateField()
invite_reason = models.CharField(max_length=64)
Langkah pertama dalam memperlihatkan model perantara ini di admin adalah menentukan sebuah kelas berderet untuk model Membership:
class MembershipInline(admin.TabularInline):
model = Membership
extra = 1
Contoh-contoh sederhana ini menggunakan nilai-nilai InlineModelAdmin awalan untuk model Membership, dan membatasi formulir tambah tambahan menjadi satu. Ini dapat berupa penyesuaian menggunakan salah satu pilihan tersedia pada kelas-kelas InlineModelAdmin.
Sekarang membuat tampilan admin untuk model Person dan Group:
class PersonAdmin(admin.ModelAdmin):
inlines = (MembershipInline,)
class GroupAdmin(admin.ModelAdmin):
inlines = (MembershipInline,)
Akhirnya, daftar model Person dan Group dengan situs admin:
admin.site.register(Person, PersonAdmin)
admin.site.register(Group, GroupAdmin)
Sekarang situs admin anda dipersiapkan untuk menyunting obyek-obyek Membership berderet dari antara Person atau Group di halaman rincian.
Menggunakan hubungan umum sebagai sebuah berderet¶
Itu memungkinkan menggunakan sebuah berderet dengan umum obyek terkait. Mari kita katakan anda memiliki model-model berikut:
from django.contrib.contenttypes.fields import GenericForeignKey
from django.db import models
class Image(models.Model):
image = models.ImageField(upload_to="images")
content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
object_id = models.PositiveIntegerField()
content_object = GenericForeignKey("content_type", "object_id")
class Product(models.Model):
name = models.CharField(max_length=100)
Jika anda ingin menyunting dan membuat sebuah instance Image pada Product, tampilan tambah/rubah anda dapat menggunakan GenericTabularInline atau GenericStackedInline (kedua subkelas-subkelas dari GenericInlineModelAdmin) disediakan oleh admin. Mereka menerapkan tata letak penampakan datar dan bertumpuk untuk formulir mewakili obyek berderet, masing-masing, seperti pasangan bukan-umum mereka. Mereka berperilaku seperti berderet lainnya. Di admin.py anda untuk contoh aplikasi ini:
from django.contrib import admin
from django.contrib.contenttypes.admin import GenericTabularInline
from myproject.myapp.models import Image, Product
class ImageInline(GenericTabularInline):
model = Image
class ProductAdmin(admin.ModelAdmin):
inlines = [
ImageInline,
]
admin.site.register(Product, ProductAdmin)
Lihat contenttypes documentation untuk informasi lebih spesifik.
Menimpa cetakan admin¶
Itu relatif mudah menimpa banyak dari cetakan yang modul admn gunakan untuk membangkitkan beragam halaman dari sebuah situs admin. Anda dapat bahkan menimpa sedikit dari cetakan-cetakan ini untuk aplikasi tertentu, atau model tertentu.
Setel direktori cetakan admin proyek¶
Berkas-berkas cetakan admin ditempatkan di direktori contrib/admin/templates/admin.
Untuk menimpa satu atau lebih mereka, pertama buat sebuah direktori admin dalam direktori templates proyek anda. Ini dapat berupa apapun dari direktori anda tentukan dalam pilihan DIRS dari backend DjangoTemplates dalam pengaturan TEMPLATES. Jika anda telah menyesuaikan pilihan 'loaders', pastikan 'django.template.loaders.filesystem.Loader' muncul sebelum 'django.template.loaders.app_directories.Loader' sehingga cetakan penyesuaian anda akan ditemukan oleh sistem pemuat cetakan sebelum mereka yang disertakan dengan django.contrib.admin.
Dalam direktori admin ini, buat sub-direktori diberi nama setelah aplikasi anda. Dalam subdirektori aplikasi ini buat sub-direktori dinamai setelah model anda. Catat, bahwa aplikasi admin akan menghuruf kecilkan nama model ketika mencari direktori, jadi pastikan anda memberi nama direktori dalam semua huruf kecil jika anda akan menjalankan aplikasi anda pada sistem berkas kasus-sensitif.
Untuk menimpa sebuah cetakan admin untuk aplikasi tertentu, salin dan sunting cetakan dari direktori django/contrib/admin/templates/admin, dan simpan itu ke satu dari direktori anda baru buat.
Sebagai contoh, jika kami ingin menambah sebuah alat pada tampilan daftar rubah untuk semua model-model dalam sebuah aplikasi bernama my_app, kami akan menyalin contrib/admin/templates/admin/change_list.html ke direktori templates/admin/my_app/ dari proyek kami, dan membuat apapun perubahan dibutuhkan.
Jika kami ingin menambah sebuah alat pada tampilan daftar rubah untuk hanya model tertentu bernama 'Page', kami akan menyalin berkas sama itu ke direktori templates/admin/my_app/page dari proyek kami.
Menimpa lawan mengganti cetakan admin¶
Karena rancangan modular dari cetakan-cetakan admin, itu biasanya tidak perlu dan tidak dianjurkan untuk mengganti keseluruhan cetakan. Itu adalah hampir selalu lebih baik menimpa hanya bagian dari cetakan yang anda butuh dirubah.
Untuk melanjutkan contoh diatas, kami ingin menambah sebuah tautan baru dekat pada alat History untuk model Page. Setelah mencari di change_form.html kami menentukan bahwa kami hanya butuh menimpa blok object-tools-items, Oleh karena itu disini adalah change_form.html baru kami :
{% extends "admin/change_form.html" %}
{% load i18n admin_urls %}
{% block object-tools-items %}
<li>
<a href="{% url opts|admin_urlname:'history' original.pk|admin_urlquote %}" class="historylink">{% trans "History" %}</a>
</li>
<li>
<a href="mylink/" class="historylink">My Link</a>
</li>
{% if has_absolute_url %}
<li>
<a href="{% url 'admin:view_on_site' content_type_id original.pk %}" class="viewsitelink">{% trans "View on site" %}</a>
</li>
{% endif %}
{% endblock %}
Dan itu dia! Jika kami menempatkan berkas ini di direktori templates/admin/my_app, tautan kami akan muncul pada formulir rubah untuk semua model dalam my_app.
Cetakan-cetakan yang mungkin menimpa per aplikasi atau model¶
Tidak setiap cetakan di contrib/admin/templates/admin mungkin ditimpa per aplikasi atau per model. Berikut dapat:
app_index.htmlchange_form.htmlchange_list.htmldelete_confirmation.htmlobject_history.htmlpopup_response.html
Kemampuan menimpa cetakan popup_response.html telah ditambahkan.
Untuk cetakan tersebut yang tidak dapat ditimpa di cara ini, anda mungkin masih menimpa mereka untuk keseluruhan proyek anda. Cukup tempatkan versi baru di direktori templates/admin anda. Ini terutama berguna untuk membuat penyesuaian halaman 404 dan 500.
Catatan
Beberapa dari cetakan-cetakan admin, seperti change_list_results.html digunakan untuk membangun etiket penyertaaan penyesuaian. Ini mungkin ditimpa, tetapi dalam kasus-kasus seprti itu anda mungkin lebih baik membuat versi anda sendiri dari etiket dalam pertanyaan dan memberikan itu sebuah nama berbeda. Cara itu anda dapat menggunakannya selektif.
Cetakan akar dan masuk¶
Jika anda berharap merubah cetakan indeks, masuk atau keluar, anda lebih baik membuat instance AdminSite anda sendiri (lihat dibawah), dan merubah sifat-sifat AdminSite.index_template , AdminSite.login_template atau AdminSite.logout_template.
Obyek AdminSite¶
-
class
AdminSite(name='admin')[sumber]¶ Sebuah situs administratif Django diwakili oleh sebuah instance dari
django.contrib.admin.sites.AdminSite; secara awalan, sebuah instance dari kelas ini dibuat sebagaidjango.contrib.admin.sitedan anda dapat mendaftar model-model anda dan instance-instanceModelAdmindengan itu.Ketika mendirikan sebuah instance dari sebuah
AdminSite, anda dapat menyediakan sebuah nama instance unik menggunakan argumennamepada pembangun. Nama instance ini digunakan untuk mencirikan instance, khususnya ketika reversing admin URLs. Jika tidak ada nama instance disediakan, sebuah nama instace awalan dariadminakan digunakan. Lihat Menyesuaikan kelas AdminSite. untuk sebuah contoh dari menyesuaikan kelasAdminSite.
Atribut AdminSite¶
Cetakan dapat dikesampingkan atau diperpanjang berdasarkan cetakan admin seperti digambarkan di Menimpa cetakan admin.
-
AdminSite.site_header¶ Teks untuk ditaruh di atas dari setiap halaman index admin, sebagai sebuah
<h1>(sebuah string). Secara awalan, ini adalah "Administrasi Django".
-
AdminSite.site_title¶ Teks untuk ditaruh pada akhir dari setiap
<title>halaman admin (sebuah string). Secara awalan, ini adalah "Situs admin Django".
-
AdminSite.site_url¶ URL untuk tautan "View site" pada atas dari setiap halaman admin. Secara awalan,
site_urladalah/. Setel itu menjadiNoneuntuk memindahkan tautanUntuk situs-situs berjalan pada subjalur, metode
each_context()memeriksa jika permintaan saat ini mempunyai kumpulanrequest.META['SCRIPT_NAME']dan menggunakan nilai itu jikasite_url``tidak menyetel ke sesuatu selain dari ``/.
-
AdminSite.index_title¶ Teks untuk ditaruh di atas dari halaman index admin (deretan karakter). Secara awalan, ini adalah "Administrasi Situs".
-
AdminSite.index_template¶ Jalur pada cetakan penyesuaian yang akan digunakan oleh tampilan indeks utama situs admin.
-
AdminSite.app_index_template¶ Jalur pada cetakan penyesuaian yang akan digunakan oleh tampilan indeks aplikasi situs admin.
-
AdminSite.empty_value_display¶ Deretan karakter yang digunakan untuk menampilkan nilai kosong di daftar perubahan situs admin. Awalan pada sebuah garis. Nilai dapat juga ditimpa pada dasar per
ModelAdmindan pada bidang penyesuaian dalamModelAdmindengan mengatur sebuah atributempty_value_displaypada bidang. LihatModelAdmin.empty_value_displaysebagai contoh.
-
AdminSite.login_template¶ Jalur pada cetakan penyesuaian yang akan digunakan oleh tampilan masuk situs admin.
-
AdminSite.login_form¶ Subkelas dari
AuthenticationFormyang akan digunakan oleh tampilan masuk situs admin.
-
AdminSite.logout_template¶ Jalur pada cetakan penyesuaian yang akan digunakan oleh tampilan keluar situs admin.
-
AdminSite.password_change_template¶ Jalur pada cetakan penyesuaian yang akan digunakan oleh tampilan merubah sandi situs admin.
-
AdminSite.password_change_done_template¶ Jalur pada cetakan penyesuaian yang akan digunakan oleh tampilan selesai merubah sandi situs admin.
Cara AdminSite¶
-
AdminSite.each_context(request)[sumber]¶ Dikembalikan sebuah kamus dari variabel-variabel untuk menaruh di konteks cetakan untuk setiap halaman di situs admin.
Menyertakan variabel-variabel berikut dan nilai-nilai secara awalan:
site_header:AdminSite.site_headersite_title:AdminSite.site_titlesite_url:AdminSite.site_urlhas_permission:AdminSite.has_permission()available_apps: sebuah daftar aplikasi dari application registry tersedia untuk pengguna saat ini. Setiap masukan dalam daftar adalah sebuah kamus mewakili sebuah aplikasi dengan kunci berikut:app_label: label aplikasiapp_url: URL dari indeks aplikasi di adminhas_module_perms: sebuah boolean mengindikasikan jika menampilkan dan mengakses dari halaman indeks modul diizinkan untuk pengguna saat inimodels: sebuah daftar dari model tersedia di aplikasi
Setiap model adalah kamus dengan kunci-kunci berikut:
object_name: nama kelas dari modelname: nama jamak dari modelperms: sebuahdictmelacak perizinanadd,change, dandeleteadmin_url: URL daftar rubah admin untuk modeladd_url: URL admin untuk menambah instance model baru
-
AdminSite.has_permission(request)[sumber]¶ Mengembalikan
Truejika pengguna untukHttpRequestyang diberikan mempunyai perizinan untuk melihat setidaknya satu halaman dalam situs admin. Awalan mewajibkan keduaUser.is_activedanUser.is_staffmenjadiTrue.
-
AdminSite.register(model_or_iterable, admin_class=None, **options)[sumber]¶ Mendaftarkan kelas model yang diberikan (atau kelas-kelas berulang) dengan
admin_classyang diberikan. Awalanadmin_classpadaModelAdmin(pilihan admin awalan). Jika argumen kata kunci diberikan -- sebagai contohlist_display-- mereka akan diberlakukan sebagai pilihan pada kelas admin.Memunculkan
ImproperlyConfiguredjika sebuah model adalah abstrak, dandjango.contrib.admin.sites.AlreadyRegisteredjika sebuah model sudah terdaftar.
Mengkaitkan instance AdminSite kedalam URLconf anda¶
The last step in setting up the Django admin is to hook your AdminSite
instance into your URLconf. Do this by pointing a given URL at the
AdminSite.urls method. It is not necessary to use
include().
Di contoh ini, kami mendaftarkan instance AdminSite awalan django.contrib.admin.site pada URL /admin/
# urls.py
from django.contrib import admin
from django.urls import path
urlpatterns = [
path('admin/', admin.site.urls),
]
Menyesuaikan kelas AdminSite.¶
Jika anda suka menyetel situs admin anda sendiri dengan penyesuaian perilaku, anda bebas untuk mensubkelaskan AdminSite dan menimpa atau menambah apapun anda sukai. Kemudian, cukup buat sebuah instance dari subkelas AdminSite anda (cara sama anda menginstasiasikan kelas Python lain) dan mendaftarkan model anda dan subkelas ModelAdmin dengan itu daripada dengan situs awalan. Akhirnya, perbaharui myproject/urls.py untuk mengacu ke subkelas AdminSite anda.
from django.contrib.admin import AdminSite
from .models import MyModel
class MyAdminSite(AdminSite):
site_header = 'Monty Python administration'
admin_site = MyAdminSite(name='myadmin')
admin_site.register(MyModel)
from django.urls import path
from myapp.admin import admin_site
urlpatterns = [
path('myadmin/', admin_site.urls),
]
Catat bahwa anda tidak mungkin ingin penemuan otomatis dari modul-modul admin ketika menggunakan instance AdminSite anda sendiri sejak anda akan mengimpor semua per-aplikasi modul-modul admin dalam modul myproject.admin anda. Ini berarti anda butuh menaruh 'django.contrib.admin.apps.SimpleAdminConfig' daripada 'django.contrib.admin' dalam pengaturan INSTALLED_APPS anda.
Banyak situs admin di URLconf yang sama¶
Itu sangat mudah membuat banyak instance dari situs admin pada situs jaringan sama dipersembahkan-Django. Cukup buat banyak instance dari AdminSite dan akar setiap satu pada URL berbeda.
Dalam contoh ini, URL fitur /basic-admin/ and /advanced-admin/ versi terpisah dari situs admin -- menggunakan instance-instance AdminSite myproject.admin.basic_site dan myproject.admin.advanced_site, masing-masing:
# urls.py
from django.urls import path
from myproject.admin import advanced_site, basic_site
urlpatterns = [
path('basic-admin/', basic_site.urls),
path('advanced-admin/', advanced_site.urls),
]
Instance AdminSite mengambil argumen tunggal pada pembangun mereka, nama mereka, yang dapat apapun anda suka. Argumen ini menjadi awalan pada nama-nama URL untuk tujuan dari reversing them. Ini hanya dibutuhkan jika anda sedang menggunakan lebih dari satu AdminSite.
Menambahkan tampilan ke situs admin¶
Seperti ModelAdmin, AdminSite menyediakan sebuah metode get_urls() yang dapat ditimpa untuk menentukan tambahan tampilan untuk situs. Untuk menambah sebuah tampilan baru ke situs admin anda, perpanjang metode get_urls() dasar untuk menyertakan sebuah pola untuk tampilan baru anda.
Catatan
Tampian apapun anda bangun yang menggunakan cetakan admin, atau perpankang cetakan admin dasar, harus menyetel request.current_app sebelum membangun cetakan. Itu harus disetel antara self.name jika tampilan anda pada sebuah AdminSite atau self.admin_site.name jika tampilan anda pada sebuah ModelAdmin.
Menambahkan fitur penyetelan kembali sandi¶
Anda dapat menambah sebuah fitur penyetelan kembali sandi pada situs admin dengan menambahkan beberapa baris pada URLconf anda. Khususnya, tambah tambahkan empat pola ini:
from django.contrib.auth import views as auth_views
path(
'admin/password_reset/',
auth_views.PasswordResetView.as_view(),
name='admin_password_reset',
),
path(
'admin/password_reset/done/',
auth_views.PasswordResetDoneView.as_view(),
name='password_reset_done',
),
path(
'reset/<uidb64>/<token>/',
auth_views.PasswordResetConfirmView.as_view(),
name='password_reset_confirm',
),
path(
'reset/done/',
auth_views.PasswordResetCompleteView.as_view(),
name='password_reset_complete',
),
(Ini menganggap anda telah menambahkan admin pada admin/ dan diwajibkan bahwa anda menaruh URL dimulai dengan ^admin/ sebelum baris yang menyertakan aplikasi admin itu sendiri).
Kehadiran dari URL bernama admin_password_reset akan menyebabkan sebuah tautan "forgotten your password?" muncul pada halaman masuk admin awalan dibawah kotak sandi.
Obyek LogEntry¶
-
class
models.LogEntry¶ Kelas
LogEntrymelacak penambahan, perubahan, penghapusan dari obyek melalui antarmuka admin.
Atribut LogEntry¶
-
LogEntry.action_time¶ Tanggal dan waktu dari tindakan.
-
LogEntry.user¶ Pengguna (sebuah instance
AUTH_USER_MODEL) yang melakukan tindakan.
-
LogEntry.content_type¶ ContentTypedari obyek dirubah.
-
LogEntry.object_id¶ Perwakilan tekstual dari primary key obyek yang telah dirubah.
-
LogEntry.object_repr¶ repr()obyek setelah perubahan.
-
LogEntry.action_flag¶ Jenis dari tindakan dicatat:
ADDITION,CHANGE,DELETION.Sebagai contoh, untuk mendapatkan daftar dari semua tambahan selesai melalui admin:
from django.contrib.admin.models import ADDITION, LogEntry LogEntry.objects.filter(action_flag=ADDITION)
-
LogEntry.change_message¶ Gambaran rincian dari perubahan. Dalam kasus sebuah penyuntingan, sebagai contoh, pesan mengandung daftar dari bidang-bidang terseunting. Situs admin Django membentuk isi ini sebagai struktur JSON, sehingga
get_change_message()mengubah komposisi sebuah pesan diterjemahkan dalam bahasa pengguna saat ini. Penyesuaian kode mungkin menyetel ini sebagai string polos. Anda disarankan menggunakan metodeget_change_message()untuk mengambil nilai ini daripada mengakses itu langsung.
Cara LogEntry¶
-
LogEntry.get_edited_object()¶ Sebuah jalan pintas yang mengembalikan obyek diacukan.
-
LogEntry.get_change_message()¶ Bentuk dan terjemahkan
change_messagekedalam bahasa pengguna saat ini. Pesan-pesan dibuat sebelum Django 1.10 akan selalu diperlihatkan dalam bahasa yang mereka telah masuk.
Membalikkan URL admin¶
Ketika AdminSite disebarkan, tampilan disediakan oleh situs itu dapat diakses menggunakan URL reversing system Django.
AdminSite menyediakan corak URL bernama berikut:
| Halaman | Nama URL | Parameter |
|---|---|---|
| Indeks | indeks |
|
| Masuk | login |
|
| Keluar | keluar |
|
| Ubah sandi | password_change |
|
| Merubah sandi selesai | password_change_done |
|
| i18n JavaScript | jsi18n |
|
| Halaman indeks aplikasi | app_list |
app_label |
| Pengalihan ke halaman obyek | view_on_site |
content_type_id, object_id |
Setiap instance ModelAdmin menyediakan sebuah tambahan sekumpulan dari URL bernama:
| Halaman | Nama URL | Parameter |
|---|---|---|
| Daftar rubah | {{ app_label }}_{{ model_name }}_changelist |
|
| Tambah | {{ app_label }}_{{ model_name }}_add |
|
| Riwayat | {{ app_label }}_{{ model_name }}_history |
object_id |
| Hapus | {{ app_label }}_{{ model_name }}_delete |
object_id |
| Ubah | {{ app_label }}_{{ model_name }}_change |
object_id |
UserAdmin menyediakan sebuah URL bernama:
| Halaman | Nama URL | Parameter |
|---|---|---|
| Ubah sandi | auth_user_password_change |
user_id |
URL bernama ini didaftarkan dengan namespace aplikasi admin, dan dengan sebuah namespace instance berhubungan pada nama dari instance Site.
Jadi - jika anda ingin mendapatkan acuan pada tampilan Change untuk obyek Choice tertentu (dari aplikasi jejak pendapat) dalam admin awalan, anda akan memanggil:
>>> from django.urls import reverse
>>> c = Choice.objects.get(...)
>>> change_url = reverse('admin:polls_choice_change', args=(c.id,))
Ini akan menemukan instance terdaftar pertama dari aplikasi admin (apapun nama instance), dan memutuskan untuk tampilan untuk merubah instance poll.Choice dalam instance itu.
Jika anda inginmenemukan sebuah URL dalam instance admin tertentu, sediakan nama dari instance itu sebagai sebuah petunjuk current_app untuk membalikkan panggilan. Sebagai contoh, jika anda khususnya ingin tampilan admin dari instance admin bernama custom, anda akan butuh memanggil:
>>> change_url = reverse('admin:polls_choice_change', args=(c.id,), current_app='custom')
Untuk rincian lebih, lihat dokumentasi pada reversing namespaced URLs.
Untuk mengizinkan membalikan paling mudah dari url-url admin dalam cetakan, Django menyediakan penyaring admin_urlname yang mengambil sebuah tindakan sebagai argumen:
{% load admin_urls %}
<a href="{% url opts|admin_urlname:'add' %}">Add user</a>
<a href="{% url opts|admin_urlname:'delete' user.pk %}">Delete this user</a>
Tindakan dalam contoh-contoh diatas mencocokan bagian terakhir dari nama-nama URL untuk instance-instance ModelAdmin digambarkan diatas. Variabel 11opts`` dapat berupa obyek-obyek apapun yang mempunyai sebuah atribut app_label dan model_name dan biasanya dipasok oleh tampilan-tampilan admin untuk model saat ini.
Penghias staff_member_required¶
-
staff_member_required(redirect_field_name='next', login_url='admin:login')[sumber]¶ Penghias digunakan pada tmapilan-tampilan admin yang membutuhkan otorisasi. Sebuah tampilan dihiasi dengan fungsi ini akan memiliki perilaku berikut:
- Jika pengguna masuk, adalah anggota staf (
User.is_staff=True), dan aktif (User.is_active=True), kerjakan tampilan secara biasa. - Sebaliknya, permintaan akan dialihkan ke URL ditentukan oleh parameter
login_url, dengan jalur aslinya diminta dalam sebuah variabel string permintaan ditentukan olehredirect_field_name. Sebagai contoh:/admin/login/?next=/admin/polls/question/3/.
Contoh penggunaan:
from django.contrib.admin.views.decorators import staff_member_required @staff_member_required def my_view(request): ...
- Jika pengguna masuk, adalah anggota staf (