我正在使用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?还是其他更好的解决方
非常感谢你。
答案 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