2010-06-23 66 views
10

我在我的應用程序中使用django註冊。我想創建不同配置文件的不同類型的用戶。 例如,一個用戶是老師,另一個用戶是學生。Django註冊和多個配置文件

如何修改註冊以設置user_type並創建正確的配置文件?

+0

你有一個典型值o在那裏:P – jonasespelita 2011-04-06 09:08:20

回答

12

龍答:對

我發現The Missing Manual職位這類問題非常寶貴,因爲它解釋了很多的Django的配置文件和Django的登記系統功能。

我建議你要允許通過AUTH_PROFILE_MODULE

設置例如

#models.py 
class Profile(models.Model): 
    #add any common fields here (first_name, last_name and email come from User) 

    #perhaps add is_student or is_teacher properites here 
    @property 
    def is_student(self): 
     try: 
      self.student 
      return True 
     except Student.DoesNotExist: 
      return False 

class Teacher(Profile): 
    #teacher fields 

class Student(Profile): 
    #student fields 

Django的註冊使用信號來通知你註冊的一個配置文件使用multi table inheritance。您應該在此處創建配置文件,以確保對user.get_profile()的調用始終會返回配置文件。 使用的信號代碼是

#registration.signals.py 
user_registered = Signal(providing_args=["user", "request"]) 

處理您可以訪問的要求,即信號時,這意味着。所以當你POST時,註冊表單中包含一個標識要創建的用戶類型的字段。

#signals.py (in your project) 
user_registered.connect(create_profile) 

def create_profile(sender, instance, request, **kwargs): 
    from myapp.models import Profile, Teacher, Student 

    try: 
     user_type = request.POST['usertype'].lower() 
     if user_type == "teacher": #user .lower for case insensitive comparison 
      Teacher(user = instance).save() 
     elif user_type == "student": 
      Student(user = instance).save() 
     else: 
      Profile(user = instance).save() #Default create - might want to raise error instead 
    except KeyError: 
     Profile(user = instance).save() #Default create just a profile 

如果你想添加任何內容所創建的模型,不是由默認字段值所覆蓋,在註冊時可以很明顯的拉動,從該請求。

1

http://docs.djangoproject.com/en/1.2/topics/auth/#groups

Django的羣體是定義你正在尋找一個偉大的方式。 您可以有一個User extended profile,其中將包含教師和學生的所有屬性。

class MasterProfile(models.Model): 
    user = models.ForeignKey(User, unique=True) 
    # add all the fields here 

然後定義組:teacherstudent和你們每個MasterProfile到任何一個老師或學生聯繫起來。

Django Group表可以幫助您定義各種角色並正確地爲用戶分配用戶。

+0

但是,您如何區分這些領域呢?教師和學生最終會擁有相同的領域,對嗎?通常需要多個配置文件類型才能爲每個用戶類型設置不同的字段。 – Leonardo 2013-07-05 00:24:09

1

我有同樣的問題,我嘗試了克里斯建議的答案,但它沒有爲我工作。

我只是在Django一個新手,但我認爲處理create_profile採取的ARGS應該由信號user_registered匹配providing_args下,在克里斯的回答,他們不(我認爲他們可能匹配那些通過信號傳遞post_save ,他引用我已經失蹤手冊中所看到的使用)

我修改了他的代碼,使ARGS比賽:

def create_profile(sender, **kwargs): 
    """When user is registered also create a matching profile.""" 

    request, instance = kwargs['request'], kwargs['user'] 

    # parse request form to see whether profile is student or teacher 
    try: 
     user_type = request.POST['usertype'].lower() 
     print(user_type) 
     if user_type == "teacher": #user .lower for case insensitive comparison 
      Teacher(user = instance).save() 
     elif user_type == "student": 
      Student(user = instance).save() 
     else: 
      Userprofile(user = instance).save() #Default create - might want to raise error instead 
    except KeyError: 
     Userprofile(user = instance).save() #Default create just a profile 

,似乎是現在的工作

相關問題