如何扩展模型User?
请帮我解决这个问题。
我在django1.6中扩展了用户模型,具体如下:
class UserProfile(User):
......
......
family = models.CharField(
max_length=30,
blank=True,
)
skype = models.CharField(
max_length=50,
blank=False,
)
email_address = models.EmailField(
max_length=50,
blank=True,
)
.....
....
objects = UserManager()
这样一来,管理面板就出现了一个包含上述字段的表单。填写完数据后,这些信息会存储在数据库的表"app_userprofile"中。这个表和"auth_user"表通过外键关联。
现在的问题是,"auth_user"表中的"username"和"password"字段是空的,但每个用户都需要这些信息。
请告诉我,如何在新用户注册后(无论是通过管理面板还是网站)将"username"和"password"的数据填入"auth_user"表中。
3 个回答
首先,按照之前的回答,修改一下 UserProfile
。然后,看看这个回答: https://stackoverflow.com/a/4565957,它解释了如何在一个管理页面上把用户和用户资料的表单合并在一起。这样你就可以通过一次保存同时添加用户和他的资料了。
还有另一种解决方法:你可以定义一个自定义的用户模型,把你需要的所有字段都放在一个表里,比如用户名、密码、家庭信息等。可以参考这个页面: https://docs.djangoproject.com/en/1.6/topics/auth/customizing/#specifying-a-custom-user-model。
使用一对一的字段,当你第一次访问 user.profile 时,它会自动创建一个 Profile 对象。
from django.contrib.auth.models import User
from django.db import models
class Profile(models.Model):
user = models.OneToOneField(User, unique=True)
User.profile = property(lambda u: Profile.objects.get_or_create(user=u)[0])
我觉得你需要使用AbstractUser模型。如果你让UserProfile继承自User模型,你会得到两个表,它们的字段是一样的。当你在app.UserProfile的密码字段里填入值时,这个值不会出现在auth.User表里。
当然,你可以像这样做:https://stackoverflow.com/a/23390975/1761844,但更好的方法是创建你自己的自定义用户:
from django.contrib.auth.models import AbstractUser
class CustomUser(AbstractUser):
... your custom fields ...
然后把它添加到你的settings.py文件里
AUTH_USER_MODEL = 'app.CustomUser'
这样一来,你就可以得到一个带有你自定义字段的用户模型。你可以像这样在你的应用中导入它:
from django.contrib.auth import get_user_model
User = get_user_model()
并且可以这样创建外键:
owner = models.OneToOneField(settings.AUTH_USER_MODEL)
这里有一个链接到Django文档的地址:https://docs.djangoproject.com/en/dev/topics/auth/customizing/#extending-django-s-default-user