当前位置:  开发笔记 > 后端 > 正文

如何根据用户限制django-admin中的字段?

如何解决《如何根据用户限制django-admin中的字段?》经验,为你挑选了1个好方法。

我想这里会讨论类似的问题,但我找不到它.

假设我有一名编辑和一名主管.我希望编辑能够添加新内容(例如新闻帖子),但在发布之前必须由主管确认.

当编辑列出的所有项目,我想设置的模型某些字段(如一个"ACK"字段)为只读(这样他就可以知道已经ack'ed,什么是仍在等待批准),但管理员应该能够改变一切(list_editable将是完美的)

这个问题的可能解决方案是什么?



1> diegueus9..:

我认为有一种更简单的方法:

嘉宾,我们有同样的Blog-Post问题

博客/ models.py:

Class Blog(models.Model):
     ...
     #fields like autor, title, stuff..
     ...

class Post(models.Model):
     ...
     #fields like blog, title, stuff..
     ...
     approved = models.BooleanField(default=False)
     approved_by = models.ForeignKey(User) 
     class Meta:
         permissions = (
             ("can_approve_post", "Can approve post"),
         )

而魔术在管理员:

博客/ admin.py:

...
from django.views.decorators.csrf import csrf_protect
...
def has_approval_permission(request, obj=None):
     if request.user.has_perm('blog.can_approve_post'):
         return True
     return False

Class PostAdmin(admin.ModelAdmin):
     @csrf_protect
     def changelist_view(self, request, extra_context=None):
         if not has_approval_permission(request):
             self.list_display = [...] # list of fields to show if user can't approve the post
             self.editable = [...]
         else:
             self.list_display = [...] # list of fields to show if user can approve the post
         return super(PostAdmin, self).changelist_view(request, extra_context)
     def get_form(self, request, obj=None, **kwargs):
         if not has_approval_permission(request, obj):
             self.fields = [...] # same thing
         else:
             self.fields = ['approved']
         return super(PostAdmin, self).get_form(request, obj, **kwargs)

通过这种方式,您可以在django中使用自定义权限的api ,并且可以覆盖保存模型的方法或获取查询集(如果必须).在methid中,has_approval_permission您可以定义用户何时可以或不可以执行某些操作的逻辑.

推荐阅读
jerry613
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有