4 min read

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 login

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.

demo crud

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

final

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

field group

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

auto

Sebenarnya ada cara yang lebih pas untuk memanipulasi form yaitu menggunakan “forms”, tapi itu untuk tulisan lainnya.