【问题标题】:how to extend model User?如何扩展模型用户?
【发布时间】:2014-06-16 22:02:57
【问题描述】:

请帮忙解决这个问题

我在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”字段“用户名”和“密码”为空。但每个用户都需要。

请告诉我在新用户注册(管理面板和网站)数据“用户名”和“密码”落入“auth_user”表后该怎么做

【问题讨论】:

    标签: python django


    【解决方案1】:

    我认为您需要使用 AbstractUser 模型。如果您从 User 模型继承 UserProfile,您将获得 2 个具有相同字段的表,并且当您填写 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

    【讨论】:

      【解决方案2】:

      首先,更改UserProfile,就像在上一个答案中提到的那样。之后,检查这个答案:https://stackoverflow.com/a/4565957,因为它解释了如何在单个管理页面上组合用户和用户配置文件表单。然后,您将能够通过一次保存添加用户和他/她的个人资料。

      还有其他方法可以解决您的问题:您可以定义一个自定义用户模型,其中包含您需要的所有字段,将用户名、密码、家庭和其他数据组合在一个表中。查看此页面以供参考:https://docs.djangoproject.com/en/1.6/topics/auth/customizing/#specifying-a-custom-user-model

      【讨论】:

        【解决方案3】:

        使用一对一字段,User.profile 将在第一次访问 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])
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-10-12
          • 2011-02-28
          • 2013-12-06
          • 2018-01-21
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多