get_object (), который зависит от `request` в UpdateView - PullRequest
0 голосов
/ 03 ноября 2019

Я пишу представление на основе классов, чтобы пользователи могли редактировать свой профиль. Поскольку я хочу, чтобы пользователи обращались к этому представлению с URL-адресом типа my_profile/edit/, а не с чем-то вроде profile/<int:pk>/edit/, использование представления на основе UpdateView довольно обременительно, поскольку получение объекта профиля пользователя требует доступа к requestобъект, и get_object не имеет прямого доступа к нему.

Мои два вопроса:

  • Должен ли я использовать UpdateView в этом случае?

  • Если это так, что будет лучшим способом переопределить get_object(self, queryset=None)? Моя лучшая попытка на данный момент заключается в следующем:

    class EditProfileView(UpdateView):
        model = UserProfile
        _request = None
    
        def get_object(self, queryset=None):
            return get_user_profile(self._request)
    
        def dispatch(self, request, *args, **kwargs): # can also override setup() in newer Django versions
            self._request = request
            return super().dispatch(request, *args, **kwargs)
    

Это выглядит достаточно чисто для меня, за исключением того, что если однажды фреймворк Django решит, что get_object должен быть вызван в начале рабочего процессаэтого фрагмента кода может быть поврежден.

1 Ответ

1 голос
/ 03 ноября 2019

Вам не нужно это делать. Все представления на основе классов делают запрос доступным как self.request.

Весь ваш код должен быть просто:

class EditProfileView(UpdateView):
    model = UserProfile

    def get_object(self, queryset=None):
        return get_user_profile(self.request)

Обратите внимание, что даже если это не так, вы все равно не сделаетенеобходимо определить _request на уровне класса. Это просто не нужно в Python.

Кроме того, я не знаю, что делает ваша get_user_profile функция, но ее, вероятно, можно заменить просто self.request.user.profile.

...