Django3.2边学边记—Adimn站点管理
准备工作
创建管理员的用户名和密码:
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)
浏览器端登录页面:类似以下后缀
//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()
来提供额外的或替代的搜索行为。