Обновление пользовательской модели в Django с помощью класса UpdateView - PullRequest
28 голосов
/ 31 мая 2011

Я пытаюсь обновить модель пользователя Django с помощью класса UpdateView, который автоматически отображается с текущим пользователем, но получаю ошибку, что требуется pk или slug.Форма работает и отображается с правильным текущим пользовательским контекстом, но выдает ошибку, когда я пытаюсь отправить изменения.Ниже представлен вид, который я использую:

class UserUpdateView(UpdateView):
    form_class = UserForm
    model = User
    template_name = 'members/user_update.html'

    def get(self, request, **kwargs):
        self.object = User.objects.get(username=self.request.user)
        form_class = self.get_form_class()
        form = self.get_form(form_class)
        context = self.get_context_data(object=self.object, form=form)
        return self.render_to_response(context)

    def form_valid(self, form):
        self.object = form.save(commit=False)
        self.object.user = self.request.user
        self.object.save()
        return HttpResponseRedirect(self.get_success_url())

Ответы [ 2 ]

28 голосов
/ 08 июня 2011

Мне нужно переопределить метод get_object() в представлении обновления и не нужно переопределять form_valid.Пользовательский метод get_object():

    def get_object(self, queryset=None):
        return self.request.user
4 голосов
/ 29 апреля 2016

Я знаю, что это старый пост, но что-то выделилось мне, и этот комментарий - информация для новичков.

Вызов get для self.object будет работать, но он не соответствует фактическим полям для получения имени пользователя, поскольку он предоставляет экземпляр пользователя:

self.object = User.objects.get(username=self.request.user)

Вы должны сопоставить аргумент имени пользователя с аргументом имени пользователя экземпляра:

self.object = User.objects.get(username=self.request.user.username)

Еще лучше, используйте pk (id):

self.object = User.objects.get(pk=self.request.user.pk)

Там может быть более аккуратный способ сделать это, поэтому я открыт для предложений.

...