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? Или другие лучшие решения?



Большое вам спасибо.

916   4  

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

    Ничего не найдено.