首页 > 解决方案 > Django Admin:限制员工更新

问题描述

我有一个Blog Model. 所有新的博客文章都有DRAFT状态。

在管理页面中,admin 将是Blog Model. 我可以通过使用 Django 的register方法来解决这个问题。

我想要的是is_staff用户可以查看所有Blog Post但不能更新状态(例如从DRAFTAPPROVE)。

有没有办法检查request's 组,然后允许用户更新或不更新?谢谢。

标签: djangodjango-admin

解决方案


最简单的解决方案是在管理类中将该字段标记status为只读,方法是readonly_fields


from django.contrib import admin
from .models import BlogPost

@admin.register(BlogPost):
class BlogPostAdmin(admin.ModelAdmin):
    readonly_fields = ('status',)

请注意,这status对所有管理员用户都是只读的。如果您需要基于当前用户的更细粒度的控制,有一种get_readonly_fields方法可以覆盖。

此外,由于 Django Admin 的所有用户都拥有is_staff,我们将明确检查内置权限以更改BlogPost.

class BlogPostAdmin(admin.ModelAdmin):
    def get_readonly_fields(self, request, obj=None):
        # obj is None if we're creating a new BlogPost, or a BlogPost instance
        # if we are editing an existing BlogPost
        if not request.user.has_perm("your_app.change_blogpost"):
            return ("status",)
        return []

推荐阅读