2012-01-26 3 views
1

Lorsque j'essaie d'enregistrer des données dans des champs de mon profil utilisateur, Django déclenche une erreur de type.comment mettre à jour des champs dans userProfile dans django

Je pensais avoir étendu le UserProfile correctement.

Mon modèle 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]) 

Dans mes paramètres j'ai ajouté:

AUTH_PROFILE_MODULE = 'timepiece.UserProfile' 

Quand je lance un test qui devrait insérer des valeurs dans les champs hérités de l'utilisateur, je reçois un 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 

La fonction testée:

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() 

Répondre

0

L'idée derrière the approach outlined in the documentation est que lorsqu'un nouvel objet User est créé, vous attachez un gestionnaire qui à son tour crée un objet UserProfile:

The method get_profile() does not create a profile if one does not exist. You need to register a handler for the User model's django.db.models.signals.post_save signal and, in the handler, if created is True, create the associated user profile

donc dans votre boucle par les membres, vous devez créer User objets, pas UserProfile objets, car ils seront automatiquement créés via le signal.

Il est pas vraiment clair comment vous obtenez des mots de passe (le processus d'inscription), mais une fois que vous avez ceux-ci, vous pouvez mettre à jour le profil de cet utilisateur en utilisant

profile = current_user_obj.get_profile() 
profile.initial = "some value" 
profile.save() 
Questions connexes