2016-01-19 3 views
0

У меня разные приложения в моем проекте django. Я хочу сохранить независимое приложение для auth & auth, которое используется повторно во всех приложениях. Auth & приложение auth - это одно приложение с моей базовой пользовательской моделью. Этот пользователь должен войти в систему по электронной почте, чтобы я наследовал от AbstractBaseUser вместо расширения класса User. Теперь во всех приложениях вход в систему аналогичен, основные пользовательские атрибуты одинаковы; но некоторые приложения добавляют дополнительные поля, такие как «зарплата», другие используют модель как есть. Итак, каков наилучший способ повторного использования модели пользовательского пользователя, созданной в моем приложении для входа? Если я наследую конкретный класс, у меня будет 2 таблицы. Если я объявлю абстрактную тему пользовательского пользователя, как я буду использовать ее функциональные возможности, роли и разрешения?Django: как повторно использовать пользовательскую модель пользователя - наследуйте или расширяйте?

+0

Это звучит, как вам нужно изменить аутентификации шаг входа в систему, чем ваши модели пользователей .. является то, что вариант? – Sayse

+0

Спасибо за ответ Sayse, я должен сказать, что нет его, хотя, с тех пор мне придется определять модель пользователя везде, только для одного или двух дополнительных столбцов в нескольких местах. – rai

+0

определите свою модель пользователя где-нибудь и импортируйте ее повсюду? – eldos

ответ

0

Я думаю, что лучший способ добиться того, что вы просите за это:

class Learners(models.Model): 
    user = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, unique=True) 
    nick = models.CharField(max_length=12, unique=True) 
    #Many to Many relationship with course 
    courses = models.ManyToManyField(Course, blank=True) 

    def __str__(self): 
     return self.user.get_full_name() 

Если AUTH_USER_MODEL устанавливается в пользовательской модели пользователя, унаследовав от AbstractBaseUser, что вы создали, как это: AUTH_USER_MODEL = 'courseSystem.MyUser' в настройках .py для основного проекта Django. В моем примере courseSystem.MyUser - это настраиваемый пользовательский класс.

Я делюсь этим с аналогичной ситуацией, описанной выше, над которой я работаю.

В приведенном выше примере, если вы должны были сделать пользовательский класс MyUser как абстрактный, а затем наследовать Learners класс от него:

class Learners(MyUser): 

затем Обучающиеся класс больше не будет иметь класс models.Model типа, но бетон Пользовательский класс для этого приложения, и в каждом случае, т. Е. Для каждого такого класса, не исполняющего абстрактный класс MyUser, вам придется перегрузить необходимые члены MyUser, необходимые для конкретного класса пользователя для Django. Кроме того, поскольку вы используете AbstractBaseUser и не распространяетесь на класс по умолчанию User, вам нужно будет определить пользовательские формы пользователя и пользовательские менеджеры для своего пользовательского класса. Так что, если у вас есть конкретный класс MyUser, как в приведенном выше примере, вы можете определить пользовательский User Manager и User Forms для MyUser один раз и поддерживать связь один-к-одному с вашими моделями в разных приложениях. Но если вы сделаете класс MyUser абстрактным, вы бы не определяли User Forms и User Managers для MyUser, но отдельно для каждого вашего приложения, в котором вы формируете конкретный класс пользователя, наследуя этот абстрактный класс пользовательского пользователя.

https://docs.djangoproject.com/en/1.9/topics/auth/customizing/

Смежные вопросы