我刚刚注意到,用户可以通过在URL中更改为其他用户的pk或用户名(如slug(来手动访问其他用户的更新配置文件视图。例如
http://127.0.0.1:8000/account/dashboard/18/updateprofile
假设用户更新配置文件url,如果该用户将pk更改为19并进行编辑,则具有pk 19配置文件的用户将被编辑,这是错误还是我方的错误?非常感谢。
我在这里的看法
class ProfilepdateView(LoginRequiredMixin, SuccessMessageMixin, UpdateView):
login_url = 'userlogin'
fields = ('age', 'location')
model = UserProfile
template_name = 'account/updateprofile.html'
success_message = "Your profile was successfully updated"
url
path('account/dashboard/<int:pk>/updateprofile', views.ProfilepdateView.as_view(), name="updateprofile"),
这取决于你来控制谁可以做什么以及在哪里做——Django猜不到这一点。这里有两个解决方案:
1/保持您的url原样,但检查当前用户(request.user
(是否允许编辑此配置文件:
def update_profile(request, profile_id):
# assume that profile as a onetone to User
profile = get_object_or_404(pk=profile_id)
if request.user != profile.user:
return HttpResponseForbidden()
# your code here
2/从url中删除profile_id,并使用request.user
获取当前用户的配置文件
def update_profile(request, profile_id):
# assume that profile as a onetone to User
profile = request.user.get_profile()
# your code here
感谢我所有能干的老板和大师,这是我为解决问题而添加到视图中的内容。
def get_queryset(self):
profile= super().get_queryset()
return profile.filter(user=self.request.user)
最后的视图是这样的
class ProfilepdateView(LoginRequiredMixin, SuccessMessageMixin, UpdateView):
login_url = 'userlogin'
fields = ('age', 'location')
model = UserProfile
template_name = 'account/updateprofile.html'
success_message = "Your profile was successfully updated"
def get_queryset(self):
profile= super().get_queryset()
return profile.filter(user=self.request.user)
这样,其他用户仍然可以访问其他用户页面,但无法更新。如果您最初只希望配置文件的所有者能够访问更新页面,那么您可以限制模板中的视图。
{% if object.user == user %} Show Page Content {% endif %}
或者就在视图中。