在网址中没有pk的Django UpdateView

时间:2014-01-07 15:25:23

标签: python django security url

我正在使用Django的UpdateView来更新用户的个人资料。 我在URL中传递了个人资料的pk,如下所示:

url(r'^profile/edit/(?P<pk>(\d+))$', profileviews.ProfileUpdateView.as_view(),

在view.py中,我只使用UpdateView:

class ProfileUpdateView(UpdateView):
    model = Profile
    form_class = UserProfileForm

它可以工作。 但是,我发现如果我以另一个用户身份登录并键入相同的URL,我将能够编辑此用户的个人资料! 这绝对是错误的,绝不应该让其他用户有权编辑其他人的个人资料。

我是否知道是否有很好的解决方案来解决这个问题?在网址中隐藏pk?还是其他更好的解决方

非常感谢你。

4 个答案:

答案 0 :(得分:3)

网址

# ... omitted
    url(r'^profile/edit/$', profileviews.ProfileUpdateView.as_view(),
# ... omitted

视图

class ProfileUpdateView(UpdateView):
    model = Profile
    form_class = UserProfileForm

    def get_object(self):
        """
        Returns the request's user.
        """
        return self.request.user.get_profile()

    # Then (unrelated, but for security)
    dispatch = login_required(UpdateView.dispatch)

答案 1 :(得分:0)

是否需要传递用户PK?只需要网址

url(r'^profile/edit/', login_required(profileviews.ProfileUpdateView.as_view()), name=profile)

并在视图中使用self.request.user以获取正确的初始信息。这样它将始终显示登录用户的信息。

编辑得更清楚一点。

答案 2 :(得分:0)

覆盖调度并检查正在编辑的配置文件是否属于当前登录的用户,这可以方便地放在mixin中以便于重用。

答案 3 :(得分:0)

您也可以使用:

@method_decorator(login_required)

在您的dispatch中装饰CBV函数,如django doc所示:

https://docs.djangoproject.com/en/1.5/topics/class-based-views/intro/#decorating-the-class