如何在通用Updateview中使用UserPassesTestMixin

时间:2017-02-17 12:39:36

标签: python django

views.py:

class ProfileView(DetailView):
    model = User
    template_name ="profile/profile_view.html"


class ProfileEdit(UserPassesTestMixin, UpdateView):
    login_url = '/login/'
    model = User
    form_class = ProfileForm
    template_name="profile/profile_new.html"

    def test_func(request, user_id):
        user = User.objects.get(pk=user_id)
        if request.user == user.user:
            return True
        else:
            return HttpResponse("<h1>You will not be able to edit other profiles</h1>")

urls.py

url(r'^(?P<pk>[0-9]+)/edit/$', ProfileEdit.as_view(), name='profile_edit')

我收到此错误:(test_func()缺少1个必需的位置参数:'user_id') This 帖子解决了我想要解决的同一问题。基于类的视图有什么不同吗?

2 个答案:

答案 0 :(得分:2)

这种方法存在一些问题。

首先,与任何方法一样,它需要self作为第一个参数。

其次,正如错误所述,调用此视图的代码不希望将user_id作为参数传递。您应该像self.kwargs中那样在基于类的视图中的任何其他位置获取该值。

第三,您尝试访问user的{​​{1}}属性,但这并不存在。您可以直接比较用户,但实际上根本不需要查询用户模型;您只需将ID与当前用户的ID进行比较。

user

但是,你也应该问问自己这是否是正确的做法。不是在URL中传递用户ID,然后检查它与登录用户的ID相同,您可以完全省略ID并始终访问当前用户。您可以通过在视图中定义def test_func(self, request): if request.user.id == int(self.kwargs['pk']): ... 来返回get_object;然后,您可以删除UserPassesTestMixin,test_func和URL参数。

答案 1 :(得分:0)

我得到了我需要的答案。

views.py

class ProfileEdit(UserPassesTestMixin, LoginRequiredMixin, UpdateView):
    model = User
    form_class = ProfileForm
    template_name="profile/profile_new.html"

    def test_func(self):
        x = self.request.user.username
        y = self.kwargs['slug']
        if x == y:
            return True
        else:
            if self.request.user.is_authenticated():
                raise Http404("You are not authenticated to edit this profile")

我更换了#id; id&#39;与&#39; slug&#39;我将用它来编辑