min*_*der 27 django django-admin
我想这里会讨论类似的问题,但我找不到它.
假设我有一名编辑和一名主管.我希望编辑能够添加新内容(例如新闻帖子),但在发布之前必须由主管确认.
当编辑列出的所有项目,我想设置的模型某些字段(如一个"ACK"字段)为只读(这样他就可以知道已经ack'ed,什么是仍在等待批准),但管理员应该能够改变一切(list_editable将是完美的)
这个问题的可能解决方案是什么?
die*_*us9 19
我认为有一种更简单的方法:
嘉宾,我们有同样的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"),
         )
Run Code Online (Sandbox Code Playgroud)
而魔术在管理员:
博客/ 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)
Run Code Online (Sandbox Code Playgroud)
通过这种方式,您可以在django中使用自定义权限的api ,并且可以覆盖保存模型的方法或获取查询集(如果必须).在methid中,has_approval_permission您可以定义用户何时可以或不可以执行某些操作的逻辑.
从 Django 1.7 开始,您现在可以使用get_fields钩子,这使得实现条件字段变得更加简单。
class MyModelAdmin(admin.ModelAdmin):
    ...
    def get_fields(self, request, obj=None):
        fields = super(MyModelAdmin, self).get_fields(request, obj)
        if request.user.is_superuser:
            fields += ('approve',)
        return fields
Run Code Online (Sandbox Code Playgroud)
        |   归档时间:  |  
           
  |  
        
|   查看次数:  |  
           7512 次  |  
        
|   最近记录:  |