2014-01-12 104 views
0

我试图从django.contrib.auth.models这样实现Users类:用户名,密码如何扩展django用户模型?

screenshoot

the code我读:

from django.db import models 
from django.contrib.auth.models import User 


class Registration(models.Model): 
    '''Represents a user registration.''' 
    user    = models.ForeignKey(User) 
    registration_date = models.DateTimeField(auto_now_add=True, help_text='The date of the registration') 

    def __str__(self): 
     return '%s - %s' % (self.user, self.registration_date,) 

该用户在默认情况下启用了两个属性可以看到有更多的属性,如姓名和电子邮件。

我该如何启用那些隐藏(如果这是正确的)属性?

回答

5

首先,这些属性不会隐藏。假设您的INSTALLED_APPS中有“django.contrib.auth”和“django.contrib.contenttypes”,那么您可以访问您的链接中定义的User模型。有关如何使用/访问它的文档,请参阅here

不过,既然你指定延长User模型,我希望你想一些自己的字段添加到它(即使你的榜样registration_date存在,并且通过myuser.date_joined是访问)。


这样做的更老,更稳定和更常见的方式与您所拥有的相似。唯一的区别是使用OneToOneField(User)而不是ForeignKey(User)。这使得双方的关系更加方便,强制一方。您确实需要确保为创建的每个User创建一个Registration对象。

实际上,有一个an example正是你想要在OneToOneField的文档中。

from django.db import models 
from django.contrib.auth.models import User 

class Registration(models.Model): 
    user = models.OneToOneField(User) 
    registration_date = models.DateTimeField(auto_now_add=True) 

>>> user = User.objects.get(pk=1) 
>>> registration = Registration.objects.create(user=user) 
>>> user.registration.registration_date 
# Should give the current time 
>>> user.get_full_name() 
# Should also have all those *hidden* attributes linked above 

由于Django的1.5,你可以很容易用自己的自定义用户模型。此功能的文档是here。如果您只是添加一些额外的字段,那么您可以继承用户模型并添加您自己的字段。

from django.db import models 
from django.contrib.auth.models import AbstractUser 

class MyUser(AbstractUser): 
    # We inherit all those nifty things from AbstractUser 
    registration_date = models.DateTimeField(auto_now_add=True) 

然后通过在您的settings.py中添加AUTH_USER_MODEL = 'myapp.MyUser'来启用它。我们现在有访问用户模式有点不同

>>> from django.contrib.auth import get_user_model() 
>>> Users = get_user_model() 
>>> user = Users.objects.get(pk=1) 
>>> user.registration_date 
# Should give the current time 
>>> user.get_full_name() 
# Should have those 'hidden' attributes 

所有这一切都可以extendingsubstituting下的文件在用户模式。

+0

但是,我可以从“添加新用户”表单中输入这些属性?例如,您可以在屏幕上看到我只能输入用户名和密码,但我想使用姓名,电子邮件和其他人。这些属性在默认模型上,所以我不想覆盖它们。 – Lucio

+0

@Lucio我看到了,你的问题是关于扩展django管理员表单。看看底部[这里]的完整示例(https://docs.djangoproject.com/en/1)。6/topics/auth/customizing /#extends-user),特别是在“应用程序的admin.py文件中需要下面的代码”的地方。当我有时间测试它时,我会更新我的帖子。 – kalhartt