前言
一個網站分爲前臺(普通用戶訪問)和管理後臺(由網站管理員訪問)兩部分
管理後臺由網站的管理員負責查看、添加、修改、刪除數據,開發這些重複的功能是一件單調乏味、缺乏創造力的工作,爲此,Django能夠根據定義的模型類自動地生成管理模塊,使用Django的管理模塊,需要按照如下步驟操作:
- 管理界面本地化
- 創建管理員
- 註冊模型類
- 自定義管理頁面
1. 激活Django站點
1.1 本地化 (語言和時區)
修改settings.py文件。
# LANGUAGE_CODE = 'en-us'
LANGUAGE_CODE = 'zh-hans' # 指定語言(注意不要寫錯,否則無法啓動服務器)
# TIME_ZONE = 'UTC'
TIME_ZONE = 'Asia/Shanghai' # 指定時區
1.2 創建登錄後臺的管理員
python3 manage.py createsuperuser
依次指定: 用戶名,郵箱,密碼
1.3 註冊模型類
在應用下的admin.py中註冊模型類:告訴djang框架,根據註冊的模型類來生成對應表管理頁面:
# admin.py:
from app01.models import Department, Employee
# 註冊Model類
admin.site.register(Department)
admin.site.register(Employee)
1.4 自定義數據模型顯示哪些字段信息
自定義模型管理類,作用:告訴django在生成的管理頁面上顯示哪些內容。
# admin.py:
class DepartmentAdmin(admin.ModelAdmin):
# 指定後臺網頁要顯示的字段
list_display = ["id", "name", "create_date"]
class EmployeeAdmin(admin.ModelAdmin):
# 指定後臺網頁要顯示的字段
list_display = ["id", "name", "age", "sex", "comment"]
# 註冊Model類
admin.site.register(Department, DepartmentAdmin)
admin.site.register(Employee, EmployeeAdmin)
1.5 啓動服務器,查看效果
python manage.py runserver
在瀏覽器上輸入以下地址,進入管理後臺,對數據庫表數據進行管理:
http://127.0.0.1:8000/admin
2. 準備工作
步驟1.創建Area區域模型類
class Area(models.Model):
"""地區類"""
title = models.CharField(max_length=50)
# 外鍵: 自關聯
parent = models.ForeignKey('self', null=True, blank=True)
步驟2.生成遷移文件,再作遷移,生成數據庫表;
步驟3.插入測試數據
步驟4.創建後臺管理器賬號
python manage.py createsuperuser
按提示填寫用戶名、郵箱、密碼,確認密碼。
步驟5.註冊模型類
要在後臺要能看到模型類表,需要在admin.py中註冊模型類
from django.contrib import admin
from models import *
admin.site.register(Area)
步驟6.登錄後臺,查看效果
通過http://127.0.0.1:8000/admin/訪問服務器: 輸入剛創建的用戶名和密碼,登錄到後臺管理界面,登錄成功可以看到如下,可以對Area進行增加、修改、刪除、查詢的管理操作:
3. 列表頁選項
類ModelAdmin可以控制模型在Admin界面中的展示方式,主要包括在列表頁的展示方式、添加修改頁的展示方式。
在app/admin.py中,註冊模型類前定義管理類AreaAdmin
class AreaAdmin(admin.ModelAdmin):
pass
打開app01/admin.py文件,註冊模型類代碼如下
admin.site.register(AreaInfo, AreaAdmin)
接下來介紹如何控制列表頁、增加修改頁展示效果。
3.1 每頁顯示多少條
打開booktest/admin.py文件,修改AreaAdmin類如下:
class AreaAdmin(admin.ModelAdmin):
list_per_page = 10 # 默認爲100條
在瀏覽器中查看區域信息的列表頁面,效果如下圖:
3.2 設置操作選項的位置
# app01/admin.py
class AreaAdmin(admin.ModelAdmin):
...
# 顯示頂部的選項
actions_on_top = True
# 顯示底部的選項
actions_on_bottom = True
在瀏覽器中刷新效果如下圖:
3.3 列表中的列操作
定義列表中要顯示哪些字段
# app01/admin.py
class AreaAdmin(ModelAdmin):
# 定義列表中要顯示哪些字段
list_display = ['id', 'title']
點擊列頭可以進行升序或降序排列
模型類中定義的方法也可以作爲列顯示(通過此方式可訪問關聯對象的屬性)
# models.py
class Area(models.Model):
"""區域顯示"""
...
def parent_area(self):
"""返回父級區域名"""
if self.parent is None:
return ''
return self.parent.title
註冊列:
class AreaAdmin(ModelAdmin):
...
# 定義列表中要顯示哪些字段(也可以指定方法名)
list_display = ['id', 'title', 'parent_area']
3.4 修改顯示的列的名字
列標題默認爲屬性或方法的名稱,可以通過屬性設置。對於模型屬性,通過verbose_name設置,對於方法,通過short_description設置,如下:
# models.py
class Area(models.Model):
"""區域顯示"""
# 設置verbose_name屬性
title = models.CharField(verbose_name='名稱', max_length=30) # 區域名
def parent_area(self):
"""返回父級區域名"""
if self.parent is None:
return ''
return self.parent.title
# 指定方法列顯示的名稱
parent_area.short_description = '父級區域'
# 方法列默認不能排序,需要指定方法列按id進行排序
parent_area.admin_order_field = 'id'
3.5 右側欄過濾器
使用list_filter指定過濾,只能接收字段,會將對應字段的值列出來,用於快速過濾。一般用於有重複的字段。
# admin.py
class AreaAdmin(ModelAdmin):
...
# 右側欄過濾器
list_filter = ['title']
刷新效果如下:
3.6 搜索框
使用search_fields屬性, 對指定字段的值進行搜索,支持模糊查詢
# admin.py
class AreaAdmin(ModelAdmin):
...
# 要搜索的列的值
search_fields = ['title']
刷新效果如下:
4. 編輯頁選項
4.1 顯示字段順序
# admin.py
class AreaAdmin(ModelAdmin):
...
# 表單中字段顯示的順序
fields = ['parent', 'title']
刷新效果如下:
4,2 修改對象顯示的字符串: 重寫__str__方法
# models.py
class Area(models.Model):
"""區域顯示"""
...
# 重寫方法
def __str__(self):
return self.title
刷新效果如下:
4.3 字段分組顯示
格式如下:
fieldsets=(
('組1標題',{'fields':('字段1','字段2')}),
('組2標題',{'fields':('字段3','字段4')}),
)
注意:fieldsets和fields,只能使用其中的一個
代碼:
# admin.py
class AreaAdmin(ModelAdmin):
...
# 字段分組顯示
fieldsets = (
('基本', {'fields': ('title',)}),
('高級', {'fields': ('parent',)}),
)
4.4 編輯關聯對象
- 在一對多的關係中,可以在一端的編輯頁面中編輯多端的對象,嵌入多端對象的方式包括表格、塊兩種
- 類型InlineModelAdmin:表示在模型的編輯頁面嵌入關聯模型的編輯
- 子類TabularInline:以表格的形式嵌入
- 子類StackedInline:以塊的形式嵌入
在app01/admin.py文件中添加如下代碼:
class AreaStackedInline(admin.StackedInline):
model = AreaInfo # 關聯子對象(多類對象)
class AreaAdmin(admin.ModelAdmin):
...
inlines = [AreaStackedInline]
下面再來看下錶格的效果:
class AreaTabularInline(TabularInline):
model = Area # 多類的名字
...
class AreaAdmin(admin.ModelAdmin):
...
inlines = [AreaTabularInline]
刷新效果如下:
4.5 修改預留新增選項
class AreaTabularInline(TabularInline):
...
extra = 2 # 額外預留新增選項默認爲3個
5. 重寫後臺管理模板
進入到django的admin應用的模板目錄,如下:
/home/python/.virtualenvs/py_django/lib/python2.7/site-packages/django/contrib/admin/templates/admin
找到base-site.html文件,複製到當前項目的templates/admin目錄下(admin目錄需要自行創建出來)
修改base-site.html內容:
新增一行代碼,如下圖:
刷新結果:
6. choices選項和富文本編輯器
6.1 choices選項使用
- 創建測試模型類
# apps/user/models.py
class TestModel(models.Model):
"""測試"""
ORDER_STATUS_CHOICES = (
(1, "待支付"),
(2, "待發貨"),
(3, "待收貨"),
(4, "待評價"),
(5, "已完成"),
)
status = models.SmallIntegerField(default=1,
verbose_name='訂單狀態',
choices=ORDER_STATUS_CHOICES)
class Meta(object):
db_table = 'df_test'
# 指定模型在後臺顯示的名稱
verbose_name = '測試模型'
# 去除後臺顯示的名稱默認添加的 's'
verbose_name_plural = verbose_name
- 在後臺註冊
# apps/users/admin.py
from django.contrib import admin
from apps.users.models import TestModel
admin.site.register(TestModel)
- 創建django後臺登錄賬號,並登錄到後臺
6.2 富文本編輯器使用
HTMLField富文本控件的顯示效果:
使用方式:
1.安裝依賴:
pip install django-tinymce==2.6.0
- setting.py文件中配置
INSTALLED_APPS = (
...
'tinymce', # 使用應用
)
# 配置控件顯示樣式
TINYMCE_DEFAULT_CONFIG = {
'theme': 'advanced', # 豐富樣式
'width': 600,
'height': 400,
}
- 項目/urls.py中配置url
import tinymce.urls
urlpatterns = [
...
# 包含tinymce urls配置文件
url(r'^tinymce/', include('tinymce.urls')),
]
- 在模型類中使用HTMLField
class TestModel(models.Model):
"""測試"""
# 富文本控件
desc = HTMLField(verbose_name='商品描述', null=True)
...
- 重新遷移數據庫,登錄到後臺進行測試
6.3 修改 GoodsSPU 模型類的商品詳情
- 把GoodsSPU模型類的 商品詳情 字段類型 改爲 HTMLField 類型
class GoodsSPU(BaseModel):
"""商品SPU表"""
desc = HTMLField(verbose_name="商品描述", default="", blank=True)
...
- 重新遷移數據庫,生成表
3.註冊: GoodsSPU 模型類,讓它在後臺顯示,使用富文本錄入 商品詳情
# 註冊模型類,讓它在後臺顯示
from apps.goods.models import GoodsSPU
admin.site.register(GoodsSPU)
原文鏈接:https://blog.csdn.net/weixin_41790086/article/details/80726585