1

当我尝试将数据保存到我的 UserProfile 中的字段时,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()
4

1 回答 1

0

文档中概述的方法背后的想法是,当创建一个新User对象时,您附加一个处理程序,该处理程序反过来创建一个UserProfile对象:

如果配置文件不存在,则 get_profile() 方法不会创建配置文件。您需要为 User 模型的 django.db.models.signals.post_save 信号注册一个处理程序,并且在处理程序中,如果 created 为 True,则创建关联的用户配置文件

因此,在通过成员的循环中,您应该创建User对象,而不是UserProfile对象,因为它们将通过信号自动创建。

目前还不清楚您是如何获得密码的(注册过程),但是一旦获得密码,您就可以使用更新该用户的个人资料

profile = current_user_obj.get_profile()
profile.initial = "some value"
profile.save() 
于 2012-01-26T12:04:54.373 回答