目录
第一种注册model的方法
认识后台管理页面
第二种注册model的方法
ModelAdmin的常用属性
利用actions丰富动作工具栏
利用list_display修改显示列
利用search_fields添加搜索框
利用list_filter添加过滤器
利用ordering重新定义Model实例的顺序
分页相关的属性
利用fields自定义显示Model的字段
利用exclude 自定义显示Model的字段
利用fieldsets将字段分组显示
利用readonly_fields将部分字段设置为只读
在Django中,框架为我们自动添加了后台管理系统,在管理后台中可以实现对Model实例对象的增加、删除和修改,这是非常简单且方便的,但同时这又是非常危险的,不应该每个用户都有这样的权限。
在进入管理系统之前,则需要注册管理员账号。
python manage.py createsuperuser
输入上面命令后,安装提示输入用户名、邮箱地址、密码,这就完成了注册管理元账号的操作,在这里就不演示了。
然后启动服务器,输入http://127.0.0.1:8000/admin/ 网址,就可以看到管理员登录界面了。
输入你注册的账号和密码,则就进入 Django 管理页面的索引页。
此时在后台中只有用户和组两个Model,在两个是Django中自动添加的,而应用的model则需要我们自己手动进行注册才可以使用。一共有两种方法可以对model进行注册。
第一种注册model的方法
只需要给register方法传递Model对象的列表就完成了注册过程如:
admin.site.register(blog)
则是将blog模型注册到了后台,这种方法没有附加定制化的功能,但是这对于简单的增删改操作已经足够了。此时页面就成了下图效果,已经多了blog的管理入口,点击后则可以对数据进行增删改查操作。这个就不演示了
默认情况下,管理入口的名字是Model的名字后面加上字母s显示。如果要自定义这个名称,可以在Model的Meta中声明。
class Meta:
verbose_name_plural = '博客'
声明后,显示效果则为
认识后台管理页面
默认的ChangeList页面看上去比较“简陋”,它主要包含4个区域。
- 动作工具栏:常被用于对实例对象的批处理操作。目前只有“删除所选的话题”一个动作可以使用,勾选实例,单击“执行”按钮,可以将其从数据表中删除。
- Model实例对象列表:这里会展示Topic对应数据表的数据记录,数据记录的名称取自Model中的__str__函数的返回值。这个区域会自动分页展示,默认每页100条数据。另外需要注意,这里展示的数据记录除了会按照自定义的顺序排序之外,还会自动地加上按照主键倒序排列。
- Model实例对象总数:位于实例列表的下方(如图中显示的“3话题”),Django会使用SELECT COUNT(*)的方式获取记录总数。
- 增加Model实例对象:位于页面的右上角,单击此按钮即可跳转到Model的添加页面。
需要注意,页面的标题“选择话题来修改”和Model实例对象上面的加粗“话题”都是由Topic中Meta的verbose_name指定的。
指定方式与上面的修改入口名字一样。变量名为verbose_name即可。
点击添加后,则会出现下面的页面
需要注意的是:
- 这个表单是从注册的Model中自动生成的
- 字段展示的顺序与在Model中定义的顺序相同,但是需要注意,主键和不可编辑的字段不会显示。
- 字段展示的控件由字段类型决定,
- 字段下方的文字提示由字段定义的help_text参数指定
- 对字段的修改内容如果不合法,页面会给出错误提示。
第二种注册model的方法
则是使用admin.register装饰器注册,这种方式能够实现与register方法同样的功能,并且这种方式可以通过配置对应的属性构建一个自己想要的管理后台。
ModelAdmin的常用属性
利用actions丰富动作工具栏
ChangeList中的动作工具栏默认只包含“删除所选的XX”,它可以实现批量删除Model实例对象的操作。批量操作是一个非常有用的特性,例如针对用户发布的Topic,如果能在动作工具栏中实现批量地上线和下线(对应is_online字段),会给管理员操作多个Topic时带来很多方便。这时,可以选择使用actions属性来实现。
from django.contrib import messages
from django.utils.translation import ngettext
class ArticleAdmin(admin.ModelAdmin):
...
@admin.action(description='Mark selected stories as published')
def make_published(self, request, queryset):
updated = queryset.update(status='p')
self.message_user(request, ngettext(
'%d story was successfully marked as published.',
'%d stories were successfully marked as published.',
updated,
) % updated, messages.SUCCESS)
actions = ['make_published']
上面的是官方文档中的例子,其中 queryset.update(status='p')语句则表示需要修改的数据,可以根据需求进行修改。
description='Mark selected stories as published'中的Mark selected stories as published则表示行为描述
actions = ['make_published']定义完动作后还需要在actions列表中加入修改的函数,否则是不会生效的!
利用list_display修改显示列
默认情况下,Model的ChangeList页面只会显示一列,内容是实例对象的__str__()函数返回值。如果想多显示一些列值数据,那么可以通过ModelAdmin的list_display属性来实现。
list_display是一个列表,列表内的数据可以是modle的字段名,每一个元素表示一个列,列的名称与字段名称是对应的,点击每一列还可以根据则一个列的数据进行升序或者降序
如:
list_display = ['name', 'age', 'sex']
同时,该列表中的值也可以是一个函数。该函数返回一个html代码的字符串,可以对显示字段进一步的自定义。如:
@admin.register(Avatars)
class AvatarsAdmin(admin.ModelAdmin):
def getAvatars(self):
avatars = Avatars.objects.get(nid=self.nid)
return mark_safe(f"<img src='{avatars.url.url}' style='width: 100px;height: 80px'></img>")
getAvatars.short_description = '头像'
list_display = [getAvatars]
需要注意的是,使用函数返回html文本时,需要导入一下函数
from django.utils.safestring import mark_safe
用来标记该html语句的安全。使用short_description属性可以自定义该函数显示字段位置的标题,默认为函数名。
利用search_fields添加搜索框
根据某个字段或者某几个字段的值对当前的实例列表进行搜索是很有意义的,Django考虑到了这一点,提供了search_fields属性,在ChangeList中表现为一个搜索框,查询的字段可以是CharField或TextField类型的,也可以是对ForeignKey或ManyToManyField字段类型的引用查询,使用双下画线引用字段名。
list_display是一个列表,列表内的数据必须是modle的字段名,表示可以查询添加,也支持模糊查询。如:
search_fields = ['name', 'age', ]
利用list_filter添加过滤器
配置list_filter属性,可以在Model的ChangeList页面的右侧添加过滤器,且各个过滤条件是AND的关系。list_filter是列表或者元组类型,通常使用它会传递两类元素:Model的字段名或继承自django.contrib.admin.SimpleListFilter的类。对于Model的字段名,字段类型必须属于BooleanField、CharField、DateField、DateTimeField、IntegerField、ForeignKey或ManyToManyField中的一种。同样也可以使用双下画线实现跨表关联。 如:
list_filter = ['name']
利用ordering重新定义Model实例的顺序
这个属性用于定义ChangeList中展示的Model实例的顺序,属性的值可以是元组或者列表,定义的方式与Model中Meta的ordering声明是相同的。如果没有指定的话,则默认按照Model的排序规则。如:
ordering = ['-age']
分页相关的属性
- list_per_page
- 指定每页显示多少条数据记录,默认为100
- list_max_show_all
- 当Model的总数据记录数小于等于它的时候就会出现“显示全部”的链接。默认值为200
- get_queryset
- ChangeList页面中的数据记录由get_queryset方法返回,如果想要定制返回特定的数据记录,就需要重写这个方法。
利用fields自定义显示Model的字段
默认情况下ChangeForm页面中会显示除了主键和不可编辑字段之外所有的字段,但是有些时候可能想隐藏一些敏感的字段或者不需要显示的字段,此时可以使用fields属性指定哪些字段可以显示。
该字段也是一个列表,列表内的每一个元素表示需要显示的字段,其他的字段则不会显示。同时显示的字段顺序也会按照列表内元素的顺序排列。如:
fields = ['age','name']
如果需要让多个字段显示在同一行的话,只需要将在一行中显示的字段组合放在元组中就可以了。如:
fields = [('age','name')]
利用exclude 自定义显示Model的字段
与fields类似,但是这个属性列表的元素是不显示的字段,这不会影响字段的显示顺序
利用fieldsets将字段分组显示
fieldsets可以实现将Model中的字段分组显示在ChangeForm中(同样会影响“增加”页面),它的配置方式也显得相对复杂。fieldsets是一个二元组的列表,其中的每一个二元组都是一个字段分组,且二元组的格式为:(name,field_options)。name标识分组的名称,field_options是字段分组信息的字典,其中包括了当前分组的字段列表。
利用readonly_fields将部分字段设置为只读
默认情况下,ChangeForm中显示的所有字段都是可编辑的,这本身并没有什么问题,但是,对于业务系统而言,这可能会导致一些错误。
ModelAdmin为此提供了readonly_fields,它是一个列表或元组,可以将字段的名称置于其中,这些字段将不可编辑。它还可以接收Model中的方法或ModelAdmin的方法,这将会在页面中展示这些方法的返回值。如:
readonly_fields = ('name',)
自定义admin方法
-
save_model
(request, obj, form, change)- 保存时调用的方法
-
delete_model
(request, obj)- 删除时调用的方法
-
has_add_permission
(request)- 如果允许添加对象,应返回
True
,否则返回False
。
- 如果允许添加对象,应返回
-
has_change_permission
(request, obj=None)- 如果允许添加对象,应返回
True
,否则返回False
- 如果允许添加对象,应返回
由于这类方法过多了,就不过多详解了,详细看官网链接。
文章来源:https://www.toymoban.com/news/detail-425874.html
Django 管理站点 | Django 文档 | Django (djangoproject.com)https://docs.djangoproject.com/zh-hans/4.0/ref/contrib/admin/#modeladmin-methods文章来源地址https://www.toymoban.com/news/detail-425874.html
到了这里,关于Django管理后台的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!