django☞admin管理视图

阅读量: zyh 2020-03-10 17:21:44
Categories: > Tags:

前言

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()调用父类ModelAdminget_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:,确保超级用户和登录登录用户,可以自行修改

最后其它用户没有权限访问页面