【问题标题】:Extending Django User model cannot access property扩展 Django 用户模型无法访问属性
【发布时间】:2012-12-15 02:20:24
【问题描述】:

我正在尝试扩展 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.

我的堆栈跟踪中出现 AttributeError 'unicode' object has no attribute 'get_profile''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__' 类型。

提前致谢!

【问题讨论】:

  • 您能告诉我们您在实际调用get_field 函数时使用的代码吗?你可能错误地传递了一些东西。另外,您使用的是哪个版本的 Django? (不知道的可以用pip freeze来判断。)
  • 我在调用 get_field 函数时精确地使用了 get_field(request.user)。函数的名称不同,但这无关紧要。

标签: python django django-models django-authentication


【解决方案1】:

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

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

您应该注意,从 django 1.5 开始,用户配置文件已被弃用,取而代之的是 custom user models

【讨论】:

  • 它不工作。我假设 request.user.get_profile() 相当于将 request.user 传递给一个函数并在那里调用 user.get_profile() 。注意 Profile 类存在于 myapp/models/profile.py 中。但我仍然将 AUTH_PROFILE_MODULE 设置为“myapp.Profile”。
  • 那么,当你尝试时会发生什么?
  • 我猜你的中间件正在以某种方式将 request.userUser 实例更改为字符串(unicode)。
  • 使用这个中间件:onecreativeblog.com/post/59051248/…
  • 嗯.. 该中间件似乎无法取代 request.user。您应该在视图函数的顶部添加一个print type(request.user) 以进行调试。这将向控制台输出实例的类型。如果那不是 User 实例,那么某处正在替换它。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2023-03-22
    • 2017-05-04
    • 2013-05-26
    • 1970-01-01
    • 2017-10-20
    • 2017-12-09
    • 2012-10-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多