Catatan belajar django part 2: Django Admin
Tidak bosen saya bilang, salah satu yang buat django menarik adalah dengan adanya default dashboard, django admin ini adalah bagian yang ada kaitannya dengan dashboard django.
Untuk masuk ke django admin defaultnya kita kunjungi path “/admin” nanti akan diarahkan ke form login. User yang bisa masuk ke django admin ini umumnya untuk user yang levelnya minimal is_staff. Untuk dev awal, untuk membuat superuser kita bisa menggunakan django cli, ketikan perintah berikut:
python manage.py createsuperuser
Perintah di atas akan memunculkan prompt, cukup ikuti promptnya.
Setelah mengisi prompt kita bisa login sesuai informasi yang tadi disebutkan dengan mengakses halaman admin
Admin App
Pada tulisan saya yang rekap pertama, di sana dibahas bahwa setelah kita membuat “app” maka harus didaftarkan di “installed_apps”, hal itu hanya mendaftarkan saja, salah satunya agar model dan migration terdeteksi. Untuk admin kita harus menambahkan lagi di “app/admin.py”
from django.contrib import admin # Register your models here.
Saya gunakan contoh menggunakan tulisan yang pertama, saya ingin menambahkan dashboard terkait content, maka cara yang dilakukan, setidaknya ada 3 cara yang biasa saya lakukan
Pertama kalau hanya mendaftarkan saja dan gak niat mengubah apa-apa
from django.contrib import admin from blog.models import Content # Register your models here. admin.site.register(Content)
Kedua, menyiapkan “model admin” untuk kebuthan modifikasi
from django.contrib import admin from blog.models import Content # Register your models here. class ContentAdmin(admin.ModelAdmin): pass admin.site.register(Content, ContentAdmin)
atau juga dengan “decorator”
from django.contrib import admin from blog.models import Content # Register your models here. @admin.register(Content) class ContentAdmin(admin.ModelAdmin): pass
“pass” di sana yang akan bisa kita ganti dengan fungsi-fungsi yang ada.
Saya sendiri lebih sering menggunakan versi yang ketiga.
Dengan mendaftarkan admin, maka kita langsung mendapat crud app yang lengkap.
Enak bukan, nulis kode sedikit tapi hasil maksimal.
Kustomisasi
Table:
Defaultnya hanya menampilkan [object] jika kita tidak setup fungsi __str__, atau nilai field yang dideklarasikan di __str__.
Untuk menambahkan informasi yang kita inginkan bisa tambahan di list display dan jika field ingin dibuat bentuk link gunakan “list_display_link”
from django.contrib import admin from blog.models import Content # Register your models here. @admin.register(Content) class ContentAdmin(admin.ModelAdmin): list_display = ["title", "slug", "category"] list_display_links = ["title"]
Fitur lain yang kita bisa tambahkan adalah pencarian, ada dua tipe pencarian, “by text” dan “by opsi”, misal kita ingin bisa mencari berdasarkan judul dan memilih berdasarkan kategori, tambahkan sepreti di bawah ini
from django.contrib import admin from blog.models import Content # Register your models here. @admin.register(Content) class ContentAdmin(admin.ModelAdmin): list_display = ["title", "slug", "category"] list_display_links = ["title"] search_fields = ["title"] list_filter = ["category"]
Pagination
Nilai awal yang dioberikan itu 100, kalau kita ingin ubah cukup tambahkan baris berikut
from django.contrib import admin from blog.models import Content # Register your models here. @admin.register(Content) class ContentAdmin(admin.ModelAdmin): list_display = ["title", "slug", "category"] list_display_links = ["title"] search_fields = ["title"] list_filter = ["category"] list_per_page = 2
Hasil kode di atas
Manipulasi Form
Secara default django form di admin akan memunculkan semua field yang dideklarasikan di model, bisa dilihat dari contoh awal di atas.
Membuat Readonly
Contoh misal saya ingin buat field slug jadi readonly bisa gunakan seperti ini
from django.contrib import admin from blog.models import Content # Register your models here. @admin.register(Content) class ContentAdmin(admin.ModelAdmin): list_display = ["title", "slug", "category"] list_display_links = ["title"] search_fields = ["title"] list_filter = ["category"] list_per_page = 2 readonly_fields = ["slug"]
Kita juga bisa menghilangkan field dari form, mirip dengan “readonly_fields” tapi namanya “exclude”
exclude = ["slug"]
Posisi dan Group
Bisa juga kita ubah posisi penampilan filed dan mengelompokannya, dengan cara
from django.contrib import admin from blog.models import Content # Register your models here. @admin.register(Content) class ContentAdmin(admin.ModelAdmin): list_display = ["title", "slug", "category"] list_display_links = ["title"] search_fields = ["title"] list_filter = ["category"] list_per_page = 2 readonly_fields = ["slug"] fieldsets = ( ("Primary", {"fields": ("title",)}), ("secondary", {"fields": ("category", "tags", "publish")}), (None, {"fields": ("body",)}), )
Jika hanya butuh menentukan field apa saja yang muncul dan tidak butuh untuk dikelompokan cukup menggunakan “fields”, seperti
fields = ["title", "body", "field lainnya"]
fiield dan fieldset tidak bisa digunakan bersama, pilih salah satu
jika ingin menghilangkan field, cukup jangan didaftarkan di field atau fieldset
Manipulasi Save
Pada contoh di atas kita saya menghilangkan slug, tapi slug dibutuhkan dan datanya diambil dari title yang dimodifikasi, kita bisa memanipulasinya menggunakan atau overidie fungsi save
from django.contrib import admin from blog.models import Content # Register your models here. @admin.register(Content) class ContentAdmin(admin.ModelAdmin): list_display = ["title", "slug", "category"] list_display_links = ["title"] search_fields = ["title"] list_filter = ["category"] list_per_page = 2 readonly_fields = ["slug"] fieldsets = ( ("Primary", {"fields": ("title",)}), ("secondary", {"fields": ("category", "tags", "publish")}), (None, {"fields": ("body",)}), ) def save_model(self, request, obj, form, change): if obj.id is None: title = obj.title obj.slug = title.lower().replace(" ", "-") super(ContentAdmin, self).save_model(request, obj, form, change)
Hasilnya
Sebenarnya ada cara yang lebih pas untuk memanipulasi form yaitu menggunakan “forms”, tapi itu untuk tulisan lainnya.