文章

Django - 管理後台設計

管理後台是管理者用來處理應用數據的重要工具。Django 提供了一個功能強大的內建後台(Admin site),開發者可以利用它快速設計並擴展管理界面,以滿足具體需求。本節課程將教你如何設計並自定義 Django 管理後台,提升管理效率與使用體驗。


課程目標

  1. 理解 Django 後台的基本功能與結構。
  2. 配置自定義的管理後台模型與頁面。
  3. 增強管理界面,提供更好的數據可視化與操作體驗。

課程內容

1. Django 後台基礎

Django 後台是一個開箱即用的管理界面,用於管理應用中的數據模型。其主要特性包括:

  • 自動生成的模型增刪查改界面。
  • 支持搜索、篩選器和排序功能。
  • 可通過自定義提高靈活性和美觀度。

2. 註冊模型到管理後台

admin.py 中註冊模型,以使其可管理:

1
2
3
4
5
from django.contrib import admin
from .models import Post

# 基本模型註冊
admin.site.register(Post)

3. 自定義管理介面

透過自定義 Admin 類,提升管理後台的可用性與外觀。

自定義列表頁面

顯示指定字段並添加搜索與篩選功能:

1
2
3
4
5
6
7
class PostAdmin(admin.ModelAdmin):
    list_display = ('title', 'author', 'status', 'published_date')  # 顯示的欄位
    search_fields = ('title', 'content')  # 搜索欄位
    list_filter = ('status', 'published_date')  # 篩選欄位
    ordering = ('-published_date',)  # 排序方式

admin.site.register(Post, PostAdmin)

自定義表單頁面

根據需求調整表單的欄位與佈局:

1
2
3
4
5
class PostAdmin(admin.ModelAdmin):
    fields = ('title', 'content', 'author', 'status', 'published_date')  # 表單字段順序
    readonly_fields = ('published_date',)  # 設置為唯讀字段

admin.site.register(Post, PostAdmin)

使用 Fieldsets 組織表單

分組表單字段,提升頁面清晰度:

1
2
3
4
5
6
7
class PostAdmin(admin.ModelAdmin):
    fieldsets = (
        ('基本資訊', {'fields': ('title', 'content')}),
        ('其他資訊', {'fields': ('author', 'status', 'published_date')}),
    )

admin.site.register(Post, PostAdmin)

4. 自定義內嵌模型管理

當模型之間存在關聯時,可以使用內嵌模型管理,提高操作效率。

範例:管理文章與評論

models.py 中:

1
2
3
4
class Comment(models.Model):
    post = models.ForeignKey(Post, on_delete=models.CASCADE, related_name='comments')
    content = models.TextField()
    created_date = models.DateTimeField(auto_now_add=True)

admin.py 中:

1
2
3
4
5
6
7
8
class CommentInline(admin.TabularInline):  # 或使用 StackedInline
    model = Comment
    extra = 1  # 額外顯示的空白行數

class PostAdmin(admin.ModelAdmin):
    inlines = [CommentInline]

admin.site.register(Post, PostAdmin)

5. 自定義後台標題與頁面

修改後台標題、頁面標籤等,提升品牌一致性。

settings.py 中:

1
2
3
4
5
6
7
8
ADMIN_SITE_HEADER = "我的網站後台"
ADMIN_SITE_TITLE = "網站管理"
ADMIN_INDEX_TITLE = "管理系統"

from django.contrib import admin
admin.site.site_header = ADMIN_SITE_HEADER
admin.site.site_title = ADMIN_SITE_TITLE
admin.site.index_title = ADMIN_INDEX_TITLE

6. 增強管理後台功能

篩選器

自定義篩選器以支持更靈活的數據篩選:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class StatusFilter(admin.SimpleListFilter):
    title = '文章狀態'
    parameter_name = 'status'

    def lookups(self, request, model_admin):
        return [
            ('published', '已發佈'),
            ('draft', '草稿'),
        ]

    def queryset(self, request, queryset):
        if self.value() == 'published':
            return queryset.filter(status='published')
        elif self.value() == 'draft':
            return queryset.filter(status='draft')

class PostAdmin(admin.ModelAdmin):
    list_filter = (StatusFilter,)

導出數據

導出 CSV 文件,方便數據共享:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import csv
from django.http import HttpResponse

def export_posts_to_csv(modeladmin, request, queryset):
    response = HttpResponse(content_type='text/csv')
    response['Content-Disposition'] = 'attachment; filename="posts.csv"'
    writer = csv.writer(response)
    writer.writerow(['Title', 'Author', 'Status', 'Published Date'])

    for post in queryset:
        writer.writerow([post.title, post.author, post.status, post.published_date])

    return response

export_posts_to_csv.short_description = '導出為 CSV'

class PostAdmin(admin.ModelAdmin):
    actions = [export_posts_to_csv]

課堂練習

  1. 註冊 Blog 系統中的所有模型到管理後台,並優化管理界面。
  2. 添加內嵌管理功能,實現文章與評論的聯合管理。
  3. 自定義篩選器,提供基於文章作者或狀態的篩選功能。

作業

  1. 設計一個完整的管理界面,實現文章、分類與使用者的高效管理。
  2. 在管理後台中添加數據導入與導出功能,支持 CSV 文件操作。
  3. 修改後台界面的標題與配色,打造專屬的品牌風格。

本文章以 CC BY 4.0 授權