2009-10-29 6 views
7

Comment procéder pour étendre le modèle utilisateur par défaut aux gestionnaires personnalisés?Django Custom Managers pour le modèle utilisateur

Mon application a de nombreux types d'utilisateurs qui seront définis en utilisant le modèle intégré de groupes. Ainsi, un utilisateur peut être un client, un membre du personnel, etc. Il serait idéal pour être en mesure de faire quelque chose comme:

User.clients.filter(name='Test') 

Pour obtenir tous les clients avec un nom de test. Je sais comment faire cela en utilisant des gestionnaires personnalisés pour des modèles définis par l'utilisateur, mais je ne suis pas sûr de savoir comment le faire pour le modèle User tout en gardant tous les goodies cuits, au moins de modifier le code source django lui-même qui est un non non ....

Répondre

-1

Vous pouvez le profil de l'utilisateur pour ce

AUTH_PROFILE_MODULE = 'accounts.UserProfile'

Lorsqu'un modèle de profil d'utilisateur a été défini et spécifié dans de cette manière, chaque objet Utilisateur aura une méthode - get_profile () - qui renvoie l'instance du modèle de profil utilisateur associé à cet utilisateur.

Ou vous pouvez écrire le vôtre authenticate backend. Ajouté dans les paramètres

+1

-1 Les profils utilisateur permettent d'ajouter des attributs de données supplémentaires, mais ils ne sont d'aucune aide dans ce cas. Et votre dernier bloc de code est simplement cassé (avez-vous testé?), Vous ne pouvez pas ajouter un gestionnaire à une classe comme ça, vous devez appeler la méthode add_to_class afin qu'elle soit correctement configurée. –

+0

Il aide, pour utiliser le module de profil à la place de l'utilisateur. UserProfile.user_clients.filter (name = 'Test') Mais mon dernier bloc est vraiment cassé. Merci. Je suis éditer ma réponse. – Oduvan

16

Oui, vous pouvez ajouter un gestionnaire personnalisé directement à la classe User. Ceci est monkeypatching, et il rend votre code moins maintenable (quelqu'un qui essaie de comprendre votre code peut ne pas savoir où la classe User a acquis ce gestionnaire personnalisé, ou où ils pourraient chercher pour le trouver). Dans ce cas, il est relativement inoffensif, car vous ne surchargez aucun comportement existant de la classe User, juste en ajoutant quelque chose de nouveau.

from django.contrib.auth.models import User 
User.add_to_class('clients', ClientsManager()) 

Si vous utilisez Django 1.1+, vous pouvez également la sous-classe utilisateur avec un proxy model; n'affecte pas la base de données, mais vous permet de joindre des gestionnaires supplémentaires sans monkeypatch.

+0

utile, merci. –

+2

@JoseJose s'il vous plaît marquer cette réponse comme correcte – sberder

+0

très bon, merci – nemesisdesign