Django注册和多个用户档案

10

我在我的应用程序中使用django-registration。我想创建具有不同配置文件的不同类型的用户。 例如,一个用户是教师,另一个用户是学生。

我如何修改注册以设置用户类型并创建正确的配置文件?


你那里有错别字 :P - jonasespelita
3个回答

12

长话短说:

我发现这篇缺失的手册对于解决这类问题非常有用,因为它解释了django-profiles和django-registration系统的许多功能。

我建议在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-registration使用信号通知您注册的情况。您应该在此时创建档案,以便您可以确信调用user.get_profile()始终返回一个档案。 使用的信号代码是:

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

这意味着在处理该信号时,您可以访问所发出的请求。因此,在提交注册表单时,请包括一个标识要创建哪种类型用户的字段。

#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

我遇到了同样的问题,尝试了Chris提供的答案,但对我没有用。

我只是Django的新手,但我认为handler create_profile所接受的参数应该与signal user_registered下的providing_args匹配,在Chris的答案中它们不匹配(我认为它们可能匹配signal post_save传递的参数,这是他引用的Missing Manual中使用过的)

我修改了他的代码以使参数匹配:

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

现在似乎正在工作


1

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

Django组是定义您所需的内容的好方法。 您可以有一个{{link1:用户扩展资料}},其中包含教师和学生的所有属性。
class MasterProfile(models.Model):
    user = models.ForeignKey(User, unique=True)
    # add all the fields here

然后定义组:teacherstudent,并将每个MasterProfile关联到教师或学生中的一个。
Django Group表可以帮助您定义各种角色并正确地分配用户到组中。

但是你如何以这种方式区分字段呢?老师和学生最终会拥有相同的字段,对吗?通常需要多个配置文件类型才能为每个用户类型提供不同的字段。 - Leonardo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接