在Django中为用户添加自定义字段

32 投票
5 回答
37282 浏览
提问于 2025-04-15 23:01

我正在使用Django提供的create_user()函数来创建用户。我想存储一些关于用户的额外信息。我试着按照这个链接里的说明去做:

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

但是我就是无法让它正常工作。有没有什么一步一步的指南可以让我跟着做,确保能成功?

另外,一旦我添加了这些自定义字段,我显然还需要添加、编辑或删除这些数据。但我找不到任何关于怎么做的说明。

5 个回答

19

我不知道有没有详细的步骤(不过我相信好好搜索一下应该能找到)。但我可以简单说一下。

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 记录。你可以在这里找到一个很好的代码片段和说明:这里.

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 从版本1.5开始就不推荐使用了:https://docs.djangoproject.com/en/stable/releases/1.5/#auth-profile-module

24

我知道现在说这些有点晚了,而且Django自那时起变化很大,但为了那些需要的人,我还是想分享一下。

根据Django的文档,如果你对用户模型满意,只是想添加一些额外的字段,可以按照以下步骤操作:

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- 在settings.py文件中添加以下内容:

AUTH_USER_MODEL = 'myapp.CustomUser'

完成了!

现在你可以运行python manage.py syncdb来同步数据库了。

27

推荐的做法是创建一个新的模型,并给它一个与内置的 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

撰写回答