如何将附加属性发送到指定的方法?

时间:2016-09-20 18:27:00

标签: django python-3.x django-views

我在互联网上找到了这样的解决方案:

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_funcUserPassesTestMixin class

的方法

1 个答案:

答案 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'