Как обновить поля в userProfile в Django
Когда я пытаюсь сохранить данные в полях в моем профиле пользователя, Django вызывает ошибку типа.
Я думал, что я расширил UserProfile правильно.
Моя модель userProfile:
class UserProfile(models.Model):
user = models.OneToOneField(User, unique=True, related_name='profile')
....
initials = models.CharField(max_length=5)
User.profile = property(lambda u: UserProfile.objects.get_or_create(user=u)[0])
В моих настройках я добавил:
AUTH_PROFILE_MODULE = 'timepiece.UserProfile'
Когда я запускаю тест, который должен вставить значения в унаследованные поля от пользователя, я получаю TypeError:
(erp)BAir:website jorrit$ ./manage.py test timepiece.PivotalTest.test_update_users
Creating test database for alias 'default'...
E
======================================================================
ERROR: test_update_users (timepiece.tests.pivotal.PivotalTest)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/Users/jorrit/virtualenvs/erp/erp/apps/timepiece/tests/pivotal.py", line 73, in test_update_users
UserProfile.sync_pivotal_users(self.tracker, 450001)
File "/Users/jorrit/virtualenvs/erp/erp/apps/timepiece/models.py", line 44, in sync_pivotal_users
initials = m.initials,)
File "/Library/Python/2.7/site-packages/django/db/models/base.py", line 365, in __init__
raise TypeError("'%s' is an invalid keyword argument for this function" % kwargs.keys()[0])
TypeError: 'username' is an invalid keyword argument for this function
----------------------------------------------------------------------
Ran 1 test in 1.857s
Функция, которая тестируется:
def sync_pivotal_users(tracker, project_id):
members = tracker.get_memberships_project(project_id)
for m in members:
#check if member exist in db
try:
#to know if m.id exists in current db
UserProfile.objects.get(pivotal_member_id=m.id)
#if not then create a new user
except UserProfile.DoesNotExist:
u = UserProfile(pivotal_member_id = m.id,
username = m.name, #code breaks here
email = m.email, # and here
initials = m.initials,)
u.save()
1 ответ
Идея подхода, изложенного в документации, заключается в том, что когда новый User
объект создан, вы присоединяете обработчик, который в свою очередь создает UserProfile
объект:
Метод get_profile() не создает профиль, если он не существует. Вам необходимо зарегистрировать обработчик для сигнала django.db.models.signals.post_save модели User и в обработчике, если он создан как True, создать соответствующий профиль пользователя.
так что в вашем цикле через членов, вы должны создавать User
объекты, а не UserProfile
объекты, так как они будут автоматически созданы с помощью сигнала.
Не совсем понятно, как вы получаете пароли (процесс регистрации), но как только вы их получите, вы можете обновить профиль для этого пользователя, используя
profile = current_user_obj.get_profile()
profile.initial = "some value"
profile.save()