Django - 管理後台設計
管理後台是管理者用來處理應用數據的重要工具。Django 提供了一個功能強大的內建後台(Admin site),開發者可以利用它快速設計並擴展管理界面,以滿足具體需求。本節課程將教你如何設計並自定義 Django 管理後台,提升管理效率與使用體驗。
課程目標
- 理解 Django 後台的基本功能與結構。
- 配置自定義的管理後台模型與頁面。
- 增強管理界面,提供更好的數據可視化與操作體驗。
課程內容
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]
課堂練習
- 註冊 Blog 系統中的所有模型到管理後台,並優化管理界面。
- 添加內嵌管理功能,實現文章與評論的聯合管理。
- 自定義篩選器,提供基於文章作者或狀態的篩選功能。
作業
- 設計一個完整的管理界面,實現文章、分類與使用者的高效管理。
- 在管理後台中添加數據導入與導出功能,支持 CSV 文件操作。
- 修改後台界面的標題與配色,打造專屬的品牌風格。
本文章以 CC BY 4.0 授權