扩展Django用户模型无法访问属性

时间:2012-12-30 17:27:56

标签: python django django-models django-authentication

我正在尝试在django中扩展默认用户模型。

我已经定义了一个名为Profile的类。

# code in myapp/models/profile.py

from django.db import models
from django.contrib.auth.models import User

    class Profile(models.Model):
        user = models.OneToOneField(User)
        field = models.CharField(max_length=30)
        class Meta:
            app_label="myapp"

在我的视图函数中,我调用了一个获得异常的方法:

def my_view_function(request):
    field = get_field(request.user)
    ...

def get_field(user):
   return user.profile.field
   # also tried return user.get_profile().field with AUTH_PROFILE_MODULE in settings.py set to "myapp.Profile", still does not work.

我在stacktrace 'unicode' object has no attribute 'get_profile'中得到一个AttributeError 或'unicode' object has no attribute 'profile'

当我尝试将get_field()中的用户对象与字符串连接时,我收到错误'str' cannot concatenate with 'SimpleLazyObject'。 我试过阅读request.user returns a SimpleLazyObject, how do I "wake" it?,但这没有帮助。

我正在使用中间件来确保用户已登录,因此我确信用户已登录。用户对象有什么问题?为什么django说用户对象有'__unicode__'类型。

提前致谢!

2 个答案:

答案 0 :(得分:3)

假设您AUTH_PROFILE_MODULE = 'yourapp.Profile'中有settings.py,您应该可以调用User对象上的get_profile()方法获取Profile模型(例如,request.user.get_profile())。

要获取实际字段,您需要致电request.user.get_profile().field

您应该注意,自django 1.5起,用户个人资料已弃用custom user models

答案 1 :(得分:0)

修正了它。我仔细查看了堆栈跟踪,发现我正在将字段值传递给另一个期望用户对象的函数。这导致了令人困惑的__unicode__错误。