前言
Django 管理站点 | Django 文档 | Django (djangoproject.com)
基本使用
若要在管理视图中看到某个模型,则需要先注册
<app>.admin
例如注册Author
from django.contrib import admin
from myproject.myapp.models import Author
class AuthorAdmin(admin.ModelAdmin):
list_display = []
list_filter = []
search_fileds = ()
admin.site.register(Author, AuthorAdmin)
其中类AuthorAdmin
通过继承admin.ModelAdmin
获取默认的一些方法,这些默认方法可以查看:
自定义|Django 管理站点 | Django 文档 | Django (djangoproject.com)
自定义
自定义侧边栏过滤器
list_filter | Django 管理站点 | Django 文档 | Django (djangoproject.com)
例如资源表有字段user
,user
是 User 表的外键,确保过滤器里仅显示拥有资源的用户。
则需要设置一个元组,第一个元素是字段user
,第二个元素是admin.RelatedOnlyFieldListFilter
。
第二个元素继承自 django.contrib.admin.FieldListFilter
list_filter = (
('user', admin.RelatedOnlyFieldListFilter),
)
列表过滤器通常只有在过滤器有多个选择时才会出现
过滤展示数据
例如登录用户如果是超级用户,则展示所有数据;
登录用户如果是普通用户,则展示自己的数据
class MyModelAdmin(admin.ModelAdmin):
def get_queryset(self, request):
qs = super().get_queryset(request)
if request.user.is_superuser:
return qs
return qs.filter(user=request.user)
这里利用super()
调用父类ModelAdmin
的get_queryset
方法返回QuerySet的所有模型实例.
QuerySet
有很多细化方法,例如上述代码里的filter
,关于细化方法里的参数格式,则参考Field | QuerySet
表格保存前后添加额外逻辑
save_model
方法被赋予 HttpRequest
、一个模型实例、一个 ModelForm
实例和一个基于是否添加或更改对象的布尔值。覆盖这个方法可以进行保存前或保存后的操作。
例如保存前,自动将模型user
字段设置为登录用户
def save_model(self, request, obj, form, change):
obj.user = request.user # 保存前的逻辑
super().save_model(request, obj, form, change)
pass # 保存后的逻辑
设定表格操作权限
设定普通登录用户也拥有表格修改和删除权限
def has_change_permission(self, request, obj=None):
if not obj:
return True # So they can see the change list page
if request.user.is_superuser or obj.user == request.user:
return True
else:
return False
has_delete_permission = has_change_permission
if not obj
返回True
,确保模型没有数据的时候,用户也可以看到
if request.user.is_superuser or obj.user == request.user:
,确保超级用户和登录登录用户,可以自行修改
最后其它用户没有权限访问页面