我在我的应用程序中使用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