【问题标题】:Adding custom fields to users in Django在 Django 中向用户添加自定义字段
【发布时间】:2010-05-22 04:49:18
【问题描述】:

我正在使用 Django 提供的create_user() 函数来创建我的用户。我想存储有关用户的其他信息。我尝试按照提供的说明进行操作

http://docs.djangoproject.com/en/dev/topics/auth/#storing-additional-information-about-users

但我无法让它为我工作。有没有我可以遵循的分步指南来让它发挥作用?

此外,一旦我添加了这些自定义字段,我显然需要从中添加/编辑/删除数据。我似乎找不到任何有关如何执行此操作的说明。

【问题讨论】:

  • 所以 you 是 Django create_user() 函数吗? :)
  • 我以为我是,但不幸的是我不是 :( .... 只是一个普通的老人..感谢语法纠正斧头。关于如何解决我的实际问题的任何想法?

标签: python django


【解决方案1】:

我知道为时已晚,从那时起 Django 发生了很大变化,但只是为了寻求者,

根据Django documentation,如果您对用户模型感到满意并且只想添加一些额外的字段,请执行以下操作:

1- 你的models.py 应该是这样的:

from django.contrib.auth.models import AbstractUser
class CustomUser(AbstractUser):
    mobile = models.CharField(max_length=16)
    # if your additional field is a required field, just add it, don't forget to add 'email' field too.
    # REQUIRED_FIELDS = ['mobile', 'email']

2- 将此添加到setting.py

AUTH_USER_MODEL = 'myapp.CustomUser'

完成!

现在你可以运行python manage.py syncdb

【讨论】:

  • 这个解决方案效果很好,但我不推荐它,因为很多库不使用AUTH_USER_MODEL 变量并假设您使用User 对象。
  • IMO 在 2020 年+,实际上根据文档,这是可行的方法。
【解决方案2】:

recommended way 是创建一个新模型并给它一个带有内置User 模型的OneToOneField(),如下所示:

class Student(models.Model):
    user = models.OneToOneField(User)
    college = models.CharField(max_length=30)
    major = models.CharField(max_length=30)

等等

然后你可以像这样访问字段:

user = User.objects.get(username='jsmith')
college = user.student.college

【讨论】:

【解决方案3】:

这只是另一个模型。您操作它的方式与操作您遇到的所有其他模型的方式完全相同。

【讨论】:

  • 嗯,这个是 Django 直接使用的,从 Sadegh 的回答中可以看出,要使用它,你必须去设置。这与其他模型不同。
【解决方案4】:

我不知道一步一步(尽管我确信一个可靠的谷歌会产生一些东西)。但这里是一个快速的开始。

1) 创建一个UserProfile 模型来保存额外信息并将其放入您的models.py。它可能看起来像这样:

class UserProfile(models.Model):
    #required by the auth model
    user = models.ForeignKey(User, unique=True)
    middle_name = models.CharField(max_length=30, null=True, blank=True)

2) 通过添加此行(使用适当的名称)告诉您的 settings.py 新课程:

AUTH_PROFILE_MODULE = "myapp.UserProfile"

3) 添加一个信号监听器,以便在添加新用户时创建一个空白的UserProfile 记录。您可以在here 找到一个很棒的 sn-p。

4) 处理新用户记录时,您也可以填充UserProfile 记录。这是我如何插入(注意get_profile):

if (form.is_valid()):
    cd = form.cleaned_data
    user = User.objects.create_user(cd["UserName"], cd["Email"], cd["Password"])
    user.first_name = cd["FirstName"]
    user.last_name = cd["LastName"]
    user.save()
    #Save userinfo record
    uinfo = user.get_profile()
    uinfo.middle_name = cd["MiddleName"]
    uinfo.save()

这就是它的全部内容。这并不全面,但应该为您指明正确的方向。

更新:请注意,AUTH_PROFILE_MODULE 自 v1.5 起已弃用:https://docs.djangoproject.com/en/stable/releases/1.5/#auth-profile-module

【讨论】:

  • 我试过了。我收到错误消息,指出“NoneType”对象没有属性“_default_manager”。
  • 创建了一个名为 UserProfile.py 的文件。添加了所需的代码。在 settings.py(AUTH_PROFILE_MODULE = 'app.UserProfile') 中进行了更改。尝试保存中间名时出现错误,即在 uinfo = user.get_profile()
  • 你需要把UserProfile放到models.py中。然后运行python manage.py syncdb 应用到您的数据库。检查您的数据库以确保该表已实际创建。然后再试一次。
  • 在您的示例中形成什么样的变量?它是基于某种 ModelForm 的吗?
  • 根据文档,用户配置文件将在 1.5 中被弃用(对于最近的查看者)
猜你喜欢
  • 2021-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-08
  • 2016-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多