Django Admin Interface - Panduan Lengkap
1. Konfigurasi Dasar Admin
Registrasi Model Dasar
# admin.py
from django.contrib import admin
from .models import Product, Category
# Cara Sederhana
admin.site.register(Product)
admin.site.register(Category)
# Atau dengan Dekorator
@admin.register(Product)
class ProductAdmin(admin.ModelAdmin):
pass
2. Kustomisasi Tampilan Admin
Dasar ModelAdmin
@admin.register(Product)
class ProductAdmin(admin.ModelAdmin):
# Menampilkan kolom di halaman daftar
list_display = ['name', 'price', 'category', 'created_at']
# Menambah filter di sidebar
list_filter = ['category', 'created_at']
# Menambah kolom pencarian
search_fields = ['name', 'description']
# Mengurutkan data
ordering = ['-created_at']
# Fields yang bisa diedit langsung di halaman list
list_editable = ['price']
# Membagi form ke dalam fieldset
fieldsets = (
('Informasi Utama', {
'fields': ('name', 'price', 'category')
}),
('Informasi Tambahan', {
'fields': ('description', 'image'),
'classes': ('collapse',)
}),
)
3. Fitur Display dan Filter
List Display yang Lebih Kompleks
@admin.register(Product)
class ProductAdmin(admin.ModelAdmin):
list_display = ['name', 'price', 'get_category_name', 'is_expensive']
list_per_page = 20 # Jumlah item per halaman
def get_category_name(self, obj):
return obj.category.name
get_category_name.short_description = 'Kategori'
def is_expensive(self, obj):
return obj.price > 1000000
is_expensive.boolean = True
is_expensive.short_description = 'Mahal?'
4. Inline Admin
Model Inline
class ProductImageInline(admin.TabularInline):
model = ProductImage
extra = 1 # Jumlah form kosong
@admin.register(Product)
class ProductAdmin(admin.ModelAdmin):
inlines = [ProductImageInline]
5. Actions Custom
@admin.register(Product)
class ProductAdmin(admin.ModelAdmin):
actions = ['make_published', 'set_discount']
def make_published(self, request, queryset):
queryset.update(status='published')
make_published.short_description = 'Tandai sebagai dipublikasi'
def set_discount(self, request, queryset):
for product in queryset:
product.price *= 0.9
product.save()
set_discount.short_description = 'Terapkan diskon 10%'
6. Kustomisasi Form Admin
@admin.register(Product)
class ProductAdmin(admin.ModelAdmin):
# Mengubah widget form
formfield_overrides = {
models.TextField: {'widget': forms.Textarea(attrs={'rows':4})},
}
# Kustomisasi form berdasarkan kondisi
def get_form(self, request, obj=None, **kwargs):
form = super().get_form(request, obj, **kwargs)
form.base_fields['description'].widget.attrs['class'] = 'special'
return form
7. Kustomisasi Template Admin
Override Template Admin
@admin.register(Product)
class ProductAdmin(admin.ModelAdmin):
change_list_template = 'admin/product_change_list.html'
change_form_template = 'admin/product_change_form.html'
Template Custom
{% extends "admin/change_list.html" %} {% load static %} {% block content %}
<!-- Tambahan konten custom -->
<div class="custom-stats">
<h3>Statistik Produk</h3>
<!-- ... -->
</div>
{{ block.super }} {% endblock %}
8. Tips dan Trik Admin
1. Read-only Fields
@admin.register(Product)
class ProductAdmin(admin.ModelAdmin):
readonly_fields = ['created_at', 'updated_at']
def get_readonly_fields(self, request, obj=None):
if obj: # editing existing object
return self.readonly_fields + ['sku']
return self.readonly_fields
2. Filter Horizontal/Vertical
class ProductAdmin(admin.ModelAdmin):
filter_horizontal = ('tags',) # Untuk ManyToMany fields
3. Kustomisasi Tampilan List
class ProductAdmin(admin.ModelAdmin):
list_display_links = ['name'] # Field yang bisa diklik
list_select_related = ['category'] # Optimize queries
show_full_result_count = False # Optimize untuk data besar
4. Permissions
class ProductAdmin(admin.ModelAdmin):
def has_add_permission(self, request):
return request.user.is_superuser
def has_change_permission(self, request, obj=None):
return request.user.has_perm('app.change_product')
9. Keamanan Admin
# urls.py
from django.contrib import admin
from django.urls import path
# Mengubah URL admin
admin.site.site_url = None # Menghilangkan link "View Site"
admin.site.site_header = 'Panel Admin'
admin.site.site_title = 'Admin Panel'
admin.site.index_title = 'Dashboard'
urlpatterns = [
path('admin-panel/', admin.site.urls), # URL custom
]