Django UpdateView без pk в url-адресе
Я использую приложение Django UpdateView для обновления профиля пользователя.
Я передаю pk профиля в url следующим образом:
url(r'^profile/edit/(?P<pk>(d+))$', profileviews.ProfileUpdateView.as_view(),
И в view.py, я просто использую UpdateView:
class ProfileUpdateView(UpdateView):
model = Profile
form_class = UserProfileForm
Это может сработать.
Однако я обнаруживаю, что если я войду в систему как другой пользователь и введу тот же url, я смогу Редактировать профиль этого пользователя!
Это определенно неправильно, и ни в коем случае другой пользователь не должен иметь доступ к редактированию чужого профиля.
Могу ли я узнать, есть ли очень хорошие решения чтобы решить эту проблему? Прятать ПК в url? Или другие лучшие решения?
Большое вам спасибо.
4 ответов:
URLs
# ... 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)
Есть ли вообще необходимость передавать пользователя PK? Просто пусть url будет
url(r'^profile/edit/', login_required(profileviews.ProfileUpdateView.as_view()), name=profile)И использовать
self.request.userв представлении для получения правильной исходной информации. Таким образом, он всегда будет показывать информацию о вошедшем в систему пользователе.Отредактировано для большей ясности.
Переопределите диспетчеризацию и проверьте, принадлежит ли редактируемый профиль текущему зарегистрированному пользователю, его можно удобно расположить в микшере для удобного повторного использования.
Вы также можете использовать:
@method_decorator(login_required)Чтобы украсить вашу
dispatchфункцию в вашемCBV, как показано в Django doc:Https://docs.djangoproject.com/en/1.5/topics/class-based-views/intro/#decorating-the-class
Comments