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 次 |
| 最近记录: |