Django-Guardian - 限制群组访问 class
Django-Guardian - Restrict group access to class
我已经按照 django-guardian 文档中的用户指南设置了 django-guardian。这使我有可能控制一个组是否可以查看特定的 class。这是来自 django-guardian 文档的示例,其中添加了一个字段(客户):
class Task(models.Model):
summary = models.CharField(max_length=32)
content = models.TextField()
customer = models.CharField(max_length=80)
reported_by = models.ForeignKey(User)
created_at = models.DateTimeField(auto_now_add=True)
class Meta:
permissions = (
('view_task', 'View task'),
)
这(以及 django-guardian 文档示例中的其他代码)允许我通过 django 管理员向特定用户和组授予 "View Task" 权限。问题是我想根据客户是谁来限制哪些任务组可以看到。例如,只有分配给客户 A 的顾问才能看到 task.customer = 'A' 的任务。有办法设置吗?
非常感谢任何帮助。
这可以通过 django-guardian 轻松实现,只需要您多编写一些代码即可。
例如,要限制哪些记录视图 returns 在管理更改列表中:
from django.contrib import admin
from myapp import models
from guardian.shortcuts import get_objects_for_user
@admin.register(models.Task)
class TaskAdmin(admin.ModelAdmin):
# ...
def get_queryset(self, request):
qs = super(TaskAdmin, self).get_queryset(request)
tasks = get_objects_for_user(request.user, 'myapp.view_task', klass=models.Task)
return qs.filter(task_id__in=tasks.values_list('id'))
同样,您可以在任何常规视图中执行此操作。
我已经按照 django-guardian 文档中的用户指南设置了 django-guardian。这使我有可能控制一个组是否可以查看特定的 class。这是来自 django-guardian 文档的示例,其中添加了一个字段(客户):
class Task(models.Model):
summary = models.CharField(max_length=32)
content = models.TextField()
customer = models.CharField(max_length=80)
reported_by = models.ForeignKey(User)
created_at = models.DateTimeField(auto_now_add=True)
class Meta:
permissions = (
('view_task', 'View task'),
)
这(以及 django-guardian 文档示例中的其他代码)允许我通过 django 管理员向特定用户和组授予 "View Task" 权限。问题是我想根据客户是谁来限制哪些任务组可以看到。例如,只有分配给客户 A 的顾问才能看到 task.customer = 'A' 的任务。有办法设置吗?
非常感谢任何帮助。
这可以通过 django-guardian 轻松实现,只需要您多编写一些代码即可。
例如,要限制哪些记录视图 returns 在管理更改列表中:
from django.contrib import admin
from myapp import models
from guardian.shortcuts import get_objects_for_user
@admin.register(models.Task)
class TaskAdmin(admin.ModelAdmin):
# ...
def get_queryset(self, request):
qs = super(TaskAdmin, self).get_queryset(request)
tasks = get_objects_for_user(request.user, 'myapp.view_task', klass=models.Task)
return qs.filter(task_id__in=tasks.values_list('id'))
同样,您可以在任何常规视图中执行此操作。