【问题标题】:Django problems with id in custom UserModel自定义 UserModel 中 id 的 Django 问题
【发布时间】:2013-06-03 17:28:18
【问题描述】:

我需要在我的自定义用户模型中使用 user_id 而不是 id(不要问为什么,这说来话长 :))。 我尝试使用 django 示例中的代码,但是当我尝试登录到管理后端时,我得到了 在模板 site-packages/django/contrib/admin/templates/admin/index.html 中,第 60 行出错 “用户”对象没有属性“id”

有错误的行看起来像

{% get_admin_log 10 as admin_log for_user user %}


#UserManager
class UserManager(BaseUserManager):
    def create_user(self, login_name, email, first_name, last_name, password=None):
        if not email:
            raise ValueError('The given email must be set')
        email = UserManager.normalize_email(email)
        user = self.model(login_name=login_name, email=email,     
        first_name=first_name,
        last_name=last_name,
                      is_staff=False, is_active=True, is_superuser=True)

    user.set_password(password)
    user.save(using=self._db)
    return user

def create_superuser(self, login_name, email, first_name, last_name, password):
    u = self.create_user(login_name, email, first_name, last_name, password)
    u.is_staff = True
    u.is_active = True
    u.is_superuser = True
    u.save(using=self._db)
    return u

#Model
class User(AbstractBaseUser, PermissionsMixin):
    user_id = models.AutoField(primary_key=True)
    login_name = models.CharField(max_length=30, unique=True, db_index=True)
    email = models.EmailField(max_length=255, unique=True)
    first_name = models.CharField(max_length=128)
    last_name = models.CharField(max_length=128)
    phone = models.CharField(max_length=128)

    objects = UserManager()
    USERNAME_FIELD = 'login_name'
    REQUIRED_FIELDS = ['email', 'first_name', 'last_name']

    is_staff = models.BooleanField('staff status', default=False)
    is_active = models.BooleanField('active', default=True)

    def get_full_name(self):
        full_name = '%s %s' % (self.first_name, self.last_name)
        return full_name.strip()

    def get_short_name(self):
        return self.first_name

#Admin
from django.contrib import admin
from applications.users.models import User


class UserAdmin(admin.ModelAdmin):
    list_display = ('login_name', 'email', 'first_name', 'last_name')


admin.site.register(User, UserAdmin)

我该如何解决?

【问题讨论】:

  • 将有助于发布您的用户模型以及您使用“user_id”作为唯一字段所做的工作。
  • 你的后端模型是如何定义的?
  • github.com/django/django/blob/master/django/contrib/admin/… 这是失败的地方。您最近添加了user_id 吗?如果是这样,只需清除 pyc 文件即可。

标签: django django-admin django-users


【解决方案1】:

我也有这个问题。看起来这是 Django 中的一个错误。感谢@karthikr 将我指向源代码(使用源代码卢克!),但看起来 Django 1.5 的管理员对“id”字段进行了硬编码,如果你已经定制您的用户模型。

这是他们修复它的提交:

https://github.com/django/django/commit/054ce2aa02c88221ffa5665a4b9a5739cbbd0a39

看起来修复只在 1.6 版中可用,所以我想解决方案是升级!

【讨论】:

  • 非常感谢您发布此信息。我现在知道为什么我的自定义用户模型在管理员中爆炸了,我可以在晚上睡觉了。
【解决方案2】:

快速而肮脏的解决方案:

试试这个技巧,它可能会奏效:

class User(AbstractBaseUser, PermissionsMixin):
    ...
    def __getattr__(self, name):
        if name='id':
            return self.user_id
        return self.__dict__[name]

希望这会有所帮助!

【讨论】:

  • 不,它没有帮助(我也尝试在您的代码中使用@property,但我收到一个错误:'Cannot resolve keyword 'id' into field'
  • 好的,这是一个想法。你愿意做猴子向后修补吗?以id为key,以user_id为属性?
  • 我的生产数据库中有 user_id 字段
  • 我用一个可行的方法改变了我的答案,覆盖了__getattr__ 来欺骗.id 字段访问者,你能试试吗?
  • 好的,我尝试再次遇到同样的错误。但我明白了,那个解释器输入 if == 'id' in getattr
猜你喜欢
  • 2014-12-20
  • 2020-03-03
  • 2021-06-13
  • 2020-01-24
  • 1970-01-01
  • 1970-01-01
  • 2022-06-13
  • 1970-01-01
  • 2017-11-05
相关资源
最近更新 更多