Django:自定义用户模型的返回字段

时间:2015-12-11 00:33:52

标签: django django-models

Django的User模型的默认返回字段是'username'。但是,我的应用程序需要它是'first_name'。 目前,我只是将Django分叉并对用户模型进行了此更改:

def __str__(self):
    return self.first_name

它工作正常,但我想知道是否有其他简单的方法可以在不使用Django的情况下执行此操作?

5 个答案:

答案 0 :(得分:16)

有一种方法可以在User课程中注入新方法。

from django.contrib.auth.models import User

def get_first_name(self):
    return self.first_name

User.add_to_class("__str__", get_first_name)

您可以将其放在common应用程序中(最好在models.py内)

不是很干净,但如果您只需要进行一次更改,就可以在不覆盖整个User模型的情况下完成工作。

答案 1 :(得分:5)

我认为最好的方法是使用custom user model,然后定义get_full_name()和/或get_short_name()以返回first_name

答案 2 :(得分:3)

首先,使用django documentation

创建自定义用户

一旦您拥有自定义用户,请转到 MyUser 类。添加first_name,last_name或任何你需要的字段。

你会得到这样的东西。

class MyUser(AbstractBaseUser):
    email = models.EmailField(
        verbose_name='email address',
        max_length=255,
        unique=True,
    )
    first_name = models.CharField(max_length=32)
    last_name = models.CharField(max_length=32)
    date_of_birth = models.DateField()
    is_active = models.BooleanField(default=True)
    is_admin = models.BooleanField(default=False)

    objects = MyUserManager()

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = ['date_of_birth']

    def get_full_name(self):
        # The user is identified by their email address
        return self.email

    def get_short_name(self):
        # The user is identified by their email address
        return self.email

    def __str__(self):              # __unicode__ on Python 2
        return self.email

    def has_perm(self, perm, obj=None):
        "Does the user have a specific permission?"
        # Simplest possible answer: Yes, always
        return True

    def has_module_perms(self, app_label):
        "Does the user have permissions to view the app `app_label`?"
        # Simplest possible answer: Yes, always
        return True

    @property
    def is_staff(self):
        "Is the user a member of staff?"
        # Simplest possible answer: All admins are staff
        return self.is_admin

现在,在您的课程中编辑 __ str __ 功能。

    def __str__(self):              # __unicode__ on Python 2
        return self.first_name

请记住,date_of_birth等字段是可选的。

答案 3 :(得分:2)

类似于Randy Tang's answer:您可以使用the issue Ramast mentioned来避免Proxy Model

class MyUser(User):
    class Meta:
        proxy = True

    def __str__(self):
        return self.first_name

根据文档:

  

您可以创建,删除和更新代理模型以及所有实例的实例   数据将被保存,就像您使用的是原始(非代理)数据一样   模型。

答案 4 :(得分:1)

以下解决方案是否有效?

class MyUser(User):

    def __str__(self):
        return self.first_name

不再使用User,请改用MyUser