Регистрация в Django и несколько профилей - PullRequest
10 голосов
/ 23 июня 2010

Я использую django-регистрацию в своем приложении. Я хочу создать разных пользователей с разными профилями. Например, один пользователь является учителем, а другой - студентом.

Как я могу изменить регистрацию, чтобы установить user_type и создать правильный профиль?

Ответы [ 3 ]

12 голосов
/ 07 апреля 2011

Длинный ответ: p

Я нашел Пропущенное руководство Публикация неоценима для такого рода проблем, поскольку она объясняет многие особенности профилей 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-Registration использует сигналы, чтобы уведомить вас о регистрации.В этот момент вы должны создать профиль, чтобы быть уверенным, что вызовы 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 голос
/ 17 ноября 2011

У меня была та же проблема, и я попробовал ответ, предложенный Крисом, однако он не сработал для меня.

Я только новичок в Django, но я думаю, что аргументы, взятые обработчиком create_profile, должны совпадать с аргументами под providing_args по сигналу user_registered, а в ответе Криса они не совпадают (я думаю, что они, вероятно, совпадают те, которые прошли по сигналу post_save, который, как я видел, использовался в недостающем руководстве, которое он цитирует)

Я изменил его код для соответствия аргументов:

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 голос
/ 12 апреля 2011

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

Группы Django - отличный способ определить, что вы ищете.У вас может быть один Расширенный профиль пользователя , который будет содержать все атрибуты учителей и учеников.

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

Затем определите группы: teacher и student, и вы сопоставите каждый MasterProfile сучитель или ученик.

Таблица Django Group может помочь вам определить различные роли и правильно распределить пользователей по группам.

...