Je développe un système de base de données scolaire dans Django 1.5, et prévoyais avoir un certain nombre de types d'utilisateurs différents (Student, Staff, Parent) qui sous-classe AbstractUser (en fait, un autre résumé sous-classe de AbstractUser). J'essayais juste d'ajouter une application développée en externe à mon système, qui utilise User dans un ForeignKey pour certains de ses modèles, mais cela échoue car mon type d'utilisateur n'est pas une instance 'User'. Je ne peux pas configurer les modèles d'applications pour utiliser AbstractUser car on ne peut pas utiliser de classes abstraites pour les clés étrangères. J'envisageais alors d'ajouter à mes settings.py AUTH_USER_MODEL = 'myapp.MyUser'
et en utilisant settings.AUTH_USER_MODEL au lieu de User pour ForeignKey dans l'application. Cependant, j'ai 3 types d'utilisateurs différents, donc je ne peux pas le faire non plus. Un prototype antérieur utilisé Django 1.4, qui ne prenait pas en charge les modèles utilisateur personnalisés, avait donc une référence à un utilisateur, mais cela nécessitait une jointure supplémentaire pour chaque requête, ce qui conduisait à des requêtes assez complexes. Est-ce la seule façon d'aller de l'avant, ou existe-t-il une autre solution?Sous-classe AbstractUser dans Django pour deux types d'utilisateurs
0
A
Répondre
3
Je l'ai utilisé avec succès la solution suivante:
1. Créez SchoolUser
classe models.py - ce sera votre AUTH_USER_MODEL
classe
TYPES = (('Student', 'Student'), ('Staff', 'Staff'), ('Parent', 'Parent'),)
class SchoolUser(AbstractUser):
type = models.CharField(max_length=10, choices=TYPES, default='Student')
2. Créer un fichier users.py et y mettre toute la logique des utilisateurs . Avoir une classe abstraite que tous les autres héritent de et qui mettra en œuvre la méthode de création:
class UserManager(object):
def __init__(self, user):
self.user = user
@classmethod
def factory(cls, user):
"""
Dynamically creates user object
"""
if cls.__name__.startswith(user.type): # Children class naming convention is important
return cls(user)
for sub_cls in cls.__subclasses__():
result = sub_cls.factory(user)
if result is not None:
return result
classes enfants exemples (aller aussi fichier users.py):
class StudentUser(UserManager):
def do_something(self):
pass
class StaffUser(UserManager):
def do_something(self):
pass
class ParentUser(UserManager):
def do_something(self):
pass
Views est où la magie se produit ;)
def my_view(request):
school_user = UserManager.factory(request.user)
if school_user.do_something: # each class can have different behaviour
de cette façon, vous n'avez pas besoin de savoir, quel type d'utilisateur, il est, tout mettre en œuvre votre logique.
J'espère que c'est assez clair, sinon laissez-moi savoir!
Questions connexes
- 1. Django AbstractUser Inheritence Error
- 2. Moyen correct d'étendre AbstractUser dans Django?
- 3. Django ugettext avec champ AbstractUser
- 4. L'utilisateur Django (AbstractUser) contient la clé étrangère
- 5. Django utilisateur par le sous-classement AbstractUser
- 6. Django AbstractUser n'affiche pas le modèle
- 7. Django AbstractUser erreur lors de la connexion dans
- 8. Conserver deux types exclusifs d'utilisateur dans Django?
- 9. Excluant les deux types d'utilisateurs dans django
- 10. django L'objet 'str' du modèle AbstractUser n'a pas d'attribut '_meta'
- 11. Django différents types d'utilisateurs
- 12. AbstractUser Connexion Voir
- 13. Types d'utilisateurs multiples pour l'authentification dans Django
- 14. Django Plusieurs types d'utilisateurs dans Django 1.9
- 15. Les champs ajoutés à AbstractUser de Django ne sont pas apparaître dans la migration
- 16. Types d'utilisateurs multiples dans Django
- 17. AbstractUser attributs vs UserProfile Modèle
- 18. gérer deux types d'utilisateurs dans une application
- 19. Django Étendre AbstractUser et utiliser email Champ par défaut dans un autre champ
- 20. Django 1.5 redéfinit le champ email de l'utilisateur abstractuser requis et unique
- 21. Django - Création de deux types d'utilisateurs, où un type peut être les deux
- 22. Enregistrement de différents types d'utilisateurs dans Django
- 23. Un formulaire de connexion pour deux types de comptes et LoginRequiredMixin dans django
- 24. Enregistrement de plusieurs types d'utilisateurs (Django)
- 25. Django ModelForm is_valid() types d'erreur
- 26. classes séparées pour les différents types d'utilisateurs dans Django
- 27. Interfaces 'admin' séparées pour différents types d'utilisateurs dans django
- 28. Type lié pour deux types non liés
- 29. Inscrivez-vous django avec cbv et AbstractUser erreur d'image de modèle
- 30. Django enregistre plusieurs types d'utilisateurs