用户可以从URL手动编辑另一个用户视图



我刚刚注意到,用户可以通过在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 %}

或者就在视图中。

最新更新