【问题标题】:Using Django's custom user model (Django1.6)使用 Django 自定义用户模型 (Django 1.6)
【发布时间】:2014-01-04 21:52:49
【问题描述】:

我有一个 Django 应用程序,它需要一个额外的字段(到 Book 类的多对多映射),我通过扩展 AbstractUser 来做到这一点。

如果您对 Django 的用户模型非常满意,并且只想添加一些额外的配置文件信息,您可以简单地继承 django.contrib.auth.models.AbstractUser 并添加您的自定义配置文件字段。此类提供默认 User 作为抽象模型的完整实现。

class User(AbstractUser):
    entitledBooks = models.ManyToManyField(Book)

我在 settings.py

中添加了模型
AUTH_USER_MODEL = 'BookRServer.User'

但是如何(以编程方式)创建用户?

user = User.objects.create_user() 不起作用。

【问题讨论】:

  • “不起作用”是什么意思?堆栈跟踪,好吗?另外,您是否从模型中导入用户?我认为 Django 建议的方法是改用User = get_user_model()
  • 啊......我应该更清楚。我可以“创建”一个用户,但我不能将“书”添加到“entitledBooks”。它说“对象用户没有名为Books的属性”。我只能假设它正在创建原始用户而不是我的自定义用户。

标签: python django django-models


【解决方案1】:

create_user 管理器方法只接受三个参数,用户名、电子邮件(可选)和密码(可选)。

你可以这样做:

bookset=Book.objects.all()
user = User.objects.create_user('testuser',email='1@gmail.com')
user.entitledBooks=bookset
user.save()

【讨论】:

  • 我使用了 user.entitledBooks.add,但是是的,我必须创建用户对象,然后向其中添加额外的字段。所以我会接受这个答案。
【解决方案2】:

最简单的松耦合方式是创建一个包含多对多关系的一对一关系用户配置文件模型

class UserProfile(models.Model):
    user = model.OneToOneField(User)
    # your many-to-many field here


# create user
u = User(username="", password="", email="", ...)
u.save()
u.userprofile(your fields..here)
u.userprofile.save()

这在所有 django 版本中通常是相同的。 django 1.6 基本弃用的是提供模型方法get_profile 和一些相关设置..

除非您真的想根据要求从头开始构建User 模型,否则您不必真正使用AUTH_USER_MODEL..

从用户模型中分离用户配置文件从长远来看也有帮助

【讨论】:

  • 啊。感谢您让我了解 AUTH_USER_MODEL。但是既然提供了 AbstractUser ,我想知道如何使用它。
  • 使用AUTH_USER_MODEL 假设您是从头开始自己构建所有东西,而不是其他东西。这些类需要注意一些小的安全措施。当您查看该代码时正在从头开始构建
  • 是的,我明白了。但是现在我不是使用 AbstractBaseUser,而是 AbstractUser,我不需要从头开始构建。然而,以通常的方法创建用户会创建默认用户,而不是我的自定义用户。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-28
  • 2012-05-05
  • 2014-02-07
  • 2015-03-08
  • 2015-06-18
  • 1970-01-01
相关资源
最近更新 更多