Как определить несколько типов пользователей в Django, используя существующую модель пользователя?

В Django отличная пользовательская модель в сочетании с аутентификацией. Используя это, я хочу определить несколько типов пользователей, скажем, студента и профессора. Я хочу сделать это с минимальными изменениями в существующей модели.

Одним из способов могут быть группы пользователей. Другим было бы расширение пользовательской модели и сохранение флага. Что было бы лучшим методом для моей проблемы, учитывая, что две сущности не являются полностью независимыми, а член типа один может также быть членом типа два.


person Ranveer    schedule 01.12.2014    source источник


Ответы (1)


Если я точно понимаю вашу проблему, мой выбор будет OneToOneField.

Когда я работаю над проектами, в которых клиентам нужны настроенные пользователи, одним из лучших решений является создание новой модели с OneToOneField, указывающим на пользователя Django, как модель Profile. Когда у вас есть объект User, вы можете сделать user.profile и получить профиль, связанный с пользователем (так что вы можете сделать user.profile.any_profile_field).

Я рекомендую вам использовать такое решение, потому что оно простое в управлении и масштабируемое. Если через 1 месяц вам нужно добавить новое свойство/поле/значение для пользователя, с этим решением вам нужно только изменить эту новую модель.

Здесь вы можете добавить в модель профиля столько полей, сколько вам нужно, и этим легко управлять, потому что если у вас есть пользователь, у вас есть профиль, и наоборот.

class Profile(models.Model):
    USER_TYPE_CHOICES = (
        ('s', 'Student'),
        ('t', 'Teacher' ),
    )
    user = models.OneToOneField(User)
    type_user = models.CharField(max_length=20, default='s',choices=USER_TYPE_CHOICES)

    #     ...    ...     ...
    #      Your fields here

РЕДАКТИРОВАТЬ

Если вы используете это, ваш метод authenticate может остаться таким же, как и сейчас.

Вы можете сделать что-то, как в этом примере:

user = User.objects.all()[0]  # Get the first user

user.profile  # This would return the profile object
user.profile.type_user  # This would return the type_user of the profile related with this user

Таким образом, вы можете использовать поля профиля в своей функции входа в систему или когда пользователь обращается к какому-либо URL-адресу, и проверять тип пользователя, разрешать или нет.

Пример управления шаблоном, в который могут входить только учителя:

def teacher_view(request):

    if not request.user.is_authenticated:
        # If user is not logged in, send it to login page
    else:
        if request.user.profile.type_user == 's':  # If the user is student
            # Here you can raise an error (not enough permissions), raise an error or redirect
person AlvaroAV    schedule 01.12.2014
comment
Я не очень хорошо разбираюсь в Джанго. Допустим, у меня есть этот класс. Как мне использовать методы аутентификации с ним? Соответствует ли атрибут user всем методам? - person Ranveer; 01.12.2014
comment
Хорошо, что модель пользователя не меняется. Следуя этому примеру, если у вас есть объект «Пользователь», вы можете получить доступ к профилю пользователя, и наоборот, если у вас есть объект «Профиль», вы можете получить доступ к профилю пользователя. - person AlvaroAV; 01.12.2014
comment
Ах! Я только что прочитал OneToOneField. Спасибо, это потрясающе! Почему люди используют PHP?! - person Ranveer; 01.12.2014
comment
Я изучил Django до PHP, и когда я увидел файловую структуру PHP... OMG! хахах Джанго пова! - person AlvaroAV; 01.12.2014
comment
Еще кое-что. Есть некоторые атрибуты, которые не являются общими для двух user_types. Как получить уникальные поля? - person Ranveer; 01.12.2014