我在互联网上找到了这样的解决方案:
def is_owner(self):
if self.request.user.profile_url == self.kwargs['profile_url']:
return True
else:
raise PermissionDenied
class CompanyProfileUpdateView(LoginRequiredMixin, UserPassesTestMixin, UpdateView):
model = CompanyProfile
template_name = 'profiles/create.html'
fields = ['user', 'name']
test_func = is_owner
有人能告诉我,如何向该方法发送额外的价值? 我希望有类似的东西:
def is_owner(self, profile_type):
if profile_type == 'user':
if self.request.user.profile_url == self.kwargs['profile_url']:
return True
else:
raise PermissionDenied
else:
# some code
test_func = is_owner('user')
显然无效,因为没有self
P.S。 test_func
是UserPassesTestMixin
class
答案 0 :(得分:1)
您无法对UserPassesTestMixin
进行更改。一个更简单的解决方案可能是在urls.py文件中为视图提供kwarg
,或者在类上创建一个具有不同profile_type
属性的View的新子类。
例如:
class CompanyProfileUpdateView(LoginRequiredMixin, UserPassesTestMixin, UpdateView):
model = CompanyProfile
template_name = 'profiles/create.html'
fields = ['user', 'name']
def test_func(self):
if self.kwargs['profile_type'] == 'user':
if self.request.user.profile_url == self.kwargs['profile_url']:
return True
else:
raise PermissionDenied
else:
# something
pass
urlpatterns += [
url('^$', views.CompanyProfileUpdateView.as_view(), name='update_user', kwargs={'profile_type': 'user'}),
url('^$', views.CompanyProfileUpdateView.as_view(), name='update_other', kwargs={'profile_type': 'other type'})
]
第二个选项:
class CompanyProfileUpdateView(LoginRequiredMixin, UserPassesTestMixin, UpdateView):
model = CompanyProfile
template_name = 'profiles/create.html'
fields = ['user', 'name']
profile_type = 'user'
def test_func(self):
if self.profile_type == 'user':
if self.request.user.profile_url == self.kwargs['profile_url']:
return True
else:
raise PermissionDenied
else:
# something
pass
class OtherProfileUpdateView(CompanyProfileUpdateView):
profile_type = 'other type'