2014-01-12 102 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