обновление полей профиля пользователя django - PullRequest
0 голосов
/ 25 сентября 2011

Должен быть простой ответ, но я не могу понять, что здесь не так ...

У меня есть профиль пользователя с парой простых полей.Я пытаюсь обновить их так:

if data['dob'] != None:     
    request.user.profile.dob = data['dob']  

request.user.profile.save()

Хотя, похоже, это никак не влияет.

ps Я использую небольшой трюк в своем классе UserProfile, который выглядит следующим образом:

User.profile = property(lambda u: UserProfile.objects.get_or_create(user=u)[0])

Может ли это быть частью проблемы?

Ответы [ 2 ]

0 голосов
/ 25 сентября 2011

Подумайте, что происходит в вашем коде.

Если в ваших данных есть dob, вы звоните request.user.profile. Это вызывает вашу собственность, которая делает запрос к базе данных и получает или создает экземпляр профиля.

Далее вы снова звоните request.user.profile. Угадай, что это делает? Делает новый вызов в базу данных и снова получает экземпляр профиля. Но, конечно, это новый экземпляр, хотя он ссылается на ту же строку базы данных, поэтому он не будет иметь значения для dob, которое вы только что установили в последней версии.

Теперь потенциально вы можете решить эту проблему, сохранив профиль в локальной переменной:

profile = request.user.profile
profile.dob = data['dob']
profile.save()

Но, если честно, я бы отбросил весь взлом со свойством профиля. Это вызовет у вас много проблем.

0 голосов
/ 25 сентября 2011

Возможно, будет проще использовать предложенный метод привязки профиля к пользователю django:

https://docs.djangoproject.com/en/dev/topics/auth/#storing-additional-information-about-users

Тем временем удалите [0] в конце UserProfile.objects.get_or_create (user = u), поскольку этот метод возвращает только один объект независимо от

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...