2010-06-23 65 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 

,似乎是现在的工作

相关问题