在我的Django项目中,我有模型Project
,Person
,Task
和Info
。
然而,事情是项目是父模型。人,任务和信息属于项目。
如果我添加一个Person,Task或Info,我必须选择它所属的Project(ForeignKey)。
我的问题:这些项目是独立的,我有不同的项目经理。我的目标是在管理界面中,项目A的项目经理只能向HIS项目添加一个Person,与Info和Task相同。
我不希望项目A的项目经理可以看到/编辑/添加/删除项目B的内容。很遗憾,我找不到符合我要求的Django管理员选项。
如果项目经理登录,他应该只看到属于他的项目的实例,没有别的。
你会如何解决这个问题?
答案 0 :(得分:0)
根据我的理解,我认为你的模型结构如下:
class Project(models.Model):
manager = models.ForeignKey(User)
...
class Person(models.Model):
project = models.ForeignKey(Project)
...
在admin.py
中,您可以执行各种修改以实现目标
class PersonAdmin(admin.ModelAdmin):
# other code
# this function will list persons
# only whose project has current user as project manager
def get_queryset(self, request):
qs = super(PersonAdmin, self).get_queryset(request)
if request.user.is_superuser:
return qs
return qs.filter(project__manager__user=request.user)
# this function will list the projects in dropdowns
# who has current user as project manager
def render_change_form(self, request, context, *args, **kwargs):
if not request.user.is_superuser:
context['adminform'].form.fields['project'].queryset = Project.objects.filter(manager__user=request.user)
return super(PersonAdmin, self).render_change_form(request, context, args, kwargs)
# this function is used for edit permission
def has_change_permission(self, request, obj=None):
if not obj:
return True
return obj.project.manager.user == request.user or request.user.is_superuser
# this function is used for delete permission
def has_delete_permssion(self, request, obj=None):
if not obj:
return True
return obj.project.manager.user == request.user or request.user.is_superuser