如何在每个视图的基础上将参数传递给mixin



我有一个用于管理测试用例的应用程序,这些测试用例被组织成各种项目。我试图在每个项目的基础上设置权限,即每个用户对每个项目都有不同的权限。以下是我到目前为止的想法:

class TestProjectMember(models.Model):
"""Per project permissions - a role can be set for each user for each project"""
member_name = models.ForeignKey(User, on_delete=models.SET_NULL)
project = models.ForeignKey(TestProject, on_delete=models.CASCADE)
member_role = models.CharField(choices=Choices.roles)
class TestCase(models.Model):
"""Test cases"""
tc_title = models.CharField(max_length=500, unique=True)
tc_project = models.ForeignKey(TestProject, on_delete=models.CASCADE)
class TestProject(models.Model):
"""Projects"""
project_name = models.CharField(max_length=200)
project_desc = models.CharField(max_length=500)

class TestCaseEditHeader(View):
def get(self, request, pk):
case = get_object_or_404(TestCase, id=pk)
if self.get_perm(case.tc_project, request.user, 'TA'):
form = TestCaseHeaderForm(instance=case)
context = {'case': case, 'form': form}
return render(request, 'test_case/tc_header_edit.html', context)
else:
return redirect('case_list')
def get_perm(self, curr_project, curr_user, perm):
model_perm = TestProjectMember.objects.filter(member_name=curr_user, 
project=curr_project).values_list('member_role', flat=True)
if perm in model_perm:
return True
return False

它很管用,但有点笨重。我必须从每个视图的每个get((或post((方法调用get_perm((。一个更好的解决方案可能是混合。让我困惑的是如何将每个视图所需的角色传递给mixin。对于每个视图,都有一个必需的角色,用户必须能够使用测试用例所属项目的视图。我如何告诉mixin,哪个视图需要哪个特定的角色?

您可以将其设置为类属性。

请注意,您的查询效率很低;你应该直接要求烫发。

class TestPermMixin:
def get_perm(self, curr_project, curr_user):
return TestProjectMember.objects.filter(
member_name=curr_user, project=curr_project, member_role=self.perm
).exists()

然后在具体类中设置属性:

class TestCaseEditHeader(View):
perm = 'TA'

相关内容

最新更新