方便举例,现在有个编辑教师的Admin
1 | class TeacherAdmin(object): |
在List页面将数据过滤显示
可以通过重载queryset()
去实现列表的过滤
1 | class TeacherAdmin(object): |
现实项目中的用途可以用来过滤那些已经过期或者失效的数据。因为这个queryset()
的方法不仅仅只是作用于List页面的过滤,还有其他的xadmin的功能,像关联字段的搜索。
同时,如果是有多个学校,学校的网站管理者只能操作管理员用户所属学校的教师数据,也可以在queryset()
中实现。
1 | class TeacherAdmin(object): |
将Edit页面中的外键进行过滤显示
可以通过重载get_context()
去实现过滤
如果“A学校”跟“B学校”有很多不同的班级,须要对老师的grade
的外键进行限制选择,那么就可以像这样,在编辑的页面对grade
进行过滤。
1 | class TeacherAdmin(object): |
上边这个get_context()
只作用于普通的外键样式进行过滤,如果在GradeAdmin
中对grade
设置了relfield_style = 'fk-ajax'
,那么须要用到上边提到的queryset()
进行过滤了。
Edit页面readonly_fields
、exclude
的设置
在编辑页面设置某些只读的字段或者不显示的字段可以分别通过readonly_fields
跟exclude
去设置
1 | class TeacherAdmin(object): |
但是如果须要根据自己的业务逻辑,根据当前操作管理员去动态改变该表单的字段的readonly_fields
以及exclude
的话,那么须要重载以下两个方法去实现功能
1 | class TeacherAdmin(object): |
基本上通过上边的对From的过滤以及动态设置readonly_fields
、exclude
,可以满足到很大的一部分定制开发的需求了。
再加上xadmin中的inlines
、重载save_models()
定制Admin保存数据逻辑以及重载get_form_layout()
完成页面样式配置,后端只需要修改小部分代码,就能实现很多功能。
参考: