準備工作
建立管理員的使用者名稱和密碼:
python manage.py createsuperuser
根據提示建立使用者名稱 密碼
在admin.py中註冊模型類
from django.contrib import admin
from models import Test class TestAdmin(admin.ModleAdmin):
pass admin.site.register(Test,TestAdmin)
瀏覽器端登入頁面:類似以下字尾
http://127.0.0.1:8000/admin/
管理頁面顯示
建立模型管理類來管理某個模型在後臺顯示的頁面形式
ModelAdmin類可以控制不同模型在Admin介面中的展示方式,主要包括在列表頁的展示方式、新增修改頁的展示方式
上文中展示了TestAdmin類的一種註冊方法,還有一種方法,就是使用裝飾器註冊,如下:
@admin.register(Test)
class TestAdmin(admin.ModelAdmin):
pass
頁大小
每頁中顯示多少條資料,預設為每頁顯示100條資料,設定為20
class TestAdmin(admin.ModelAdmin):
list_per_page = 20
操作選項的位置
由action_on_bottom 和action_on_top兩屬性來控制 預設顯示在頂部,預設值分別為:False 和 True,改為只顯示在底部:
class TestAdmin(admin.ModelAdmin):
list_per_page = 20
actions_on_bottom = True
actions_on_top = False
顯示哪些列
用 list_display=[模型欄位1,模型欄位2,模型方法1,...] 控制顯示的列,
Django 會嘗試按照這個順序解釋 list_display
的每個元素:
- 一個模型的欄位。
- 一個可呼叫物件。
- 一個代表
ModelAdmin
屬性的字串。 - 一個代表模型屬性的字串。
用模型屬性顯示 模型的id title pub_date 三個屬性
class TestAdmin(admin.ModelAdmin):
...
list_display = ['id','title','pub_date']
或者模型方法,要求方法有返回值,如下在模型類中定義一個方法
class TestInfo(models.Model):
...
def atitle(self):
return self.title
按以上方法顯示的列是不能排序的,如果讓這個方法顯示的列也能排序,就給atitle方法的.admin_order_field屬性,指定排序依據的模型屬性,如下:
# from django.db import models
# from django.contrib import admin
class TestInfo(models.Model):
...
def atitle(self):
return self.title
atitle.admin_order_field = 'title' #注意有引號
列標題
預設為方法的名稱,
可以通過.short_description
屬性設定
class TestInfo(models.Model):
...
atitle.short_description='標題'
如果是更改模型欄位顯示的列標題,可以在定義模型欄位時,設定verbose_name的值 ,或者封裝成方法,再對方法使用上面那個屬性,模型欄位不能直接使用那個屬性。
class Test(models.Model):
title = models.CharField(max_length=20,verbose_name='標題')
如果一個欄位的值是 None
,一個空字串,或者一個沒有元素的可迭代欄位,Django 將顯示 -
(破折號)。
你可以用empty_value_display 屬性更改
from django.contrib import admin
...
atitle.empty_value_display = '(None)'
或者管理類中設定屬性
class PersonAdmin(admin.ModelAdmin):
empty_value_display = 'unknown'
以上通過指定方法屬性來控制顯示是新老版本通用的,在Django3.2可以通過給裝飾器傳參來解決
from django.db import models
from django.contrib import admin class Test(models.Model):
.... """
empty_value:屬性值為空時 處理
description:顯示名
ordering:排序依據
boolean:返回值為bool型
其中:
empty_value 和 boolean 只能設定一個(互斥)
"""
@admin.display(empty_value='空', description='父級地名', ordering='id',boolean=True)
def title2(self):
return self.title
過濾器
用 list_filter
來啟用管理更改列表頁面右側側欄的過濾器,如下截圖所示:
list_filter
應是一個元素的列表或元組,會將對應欄位的值列出來,一般用於快速過濾有重複值的欄位
class TestAdmin(admin.ModelAdmin):
list_filter = ['is_delete']
搜尋框
用 search_fields
,在管理啟用搜索框。
class TestAdmin(admin.ModelAdmin):
search_fields = ['id','name']
在搜尋框中進行搜尋時,Django 會將搜尋查詢拆分成多個詞,並返回所有包含這些詞的物件,不區分大小寫(即 icontains
查詢:不區分大小寫的包含匹配),其中每個詞必須在 search_fields
中至少有一個。例如,如果 search_fields
設定為 ['first_name', 'last_name']
,使用者搜尋 john lennon'
,Django 會做相當於這個 SQL WHERE
子句。
WHERE (first_name ILIKE '%john%' OR last_name ILIKE '%john%')
AND (first_name ILIKE '%lennon%' OR last_name ILIKE '%lennon%')
搜尋查詢可以包含帶空格的引號短語。我的理解就是分組整體匹配(Django3.2新增),例如,如果使用者搜尋 "john winston"
或 'john winston'
,Django 會做相當於這個 SQL 的 WHERE
子句:
WHERE (first_name ILIKE '%john winston%' OR last_name ILIKE '%john winston%')
如果你不想使用 icontains
查詢方式,你可以使用 ModelAdmin.get_search_results()
來提供額外的或替代的搜尋行為。