我在我的應用程序中使用django註冊。我想創建不同配置文件的不同類型的用戶。 例如,一個用戶是老師,另一個用戶是學生。Django註冊和多個配置文件
如何修改註冊以設置user_type並創建正確的配置文件?
我在我的應用程序中使用django註冊。我想創建不同配置文件的不同類型的用戶。 例如,一個用戶是老師,另一個用戶是學生。Django註冊和多個配置文件
如何修改註冊以設置user_type並創建正確的配置文件?
龍答:對
我發現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
如果你想添加任何內容所創建的模型,不是由默認字段值所覆蓋,在註冊時可以很明顯的拉動,從該請求。
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
然後定義組:teacher
和student
和你們每個MasterProfile到任何一個老師或學生聯繫起來。
Django Group表可以幫助您定義各種角色並正確地爲用戶分配用戶。
但是,您如何區分這些領域呢?教師和學生最終會擁有相同的領域,對嗎?通常需要多個配置文件類型才能爲每個用戶類型設置不同的字段。 – Leonardo 2013-07-05 00:24:09
我有同樣的問題,我嘗試了克里斯建議的答案,但它沒有爲我工作。
我只是在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
,似乎是現在的工作
你有一個典型值o在那裏:P – jonasespelita 2011-04-06 09:08:20