Django
Admin Panel

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
]