2013-05-23 2 views
4

J'essaie de rendre les applications plugables plus résistantes sous Django 1.5 où vous avez maintenant un modèle utilisateur personnalisable.Une meilleure façon d'importer AUTH_USER_MODEL dans Django 1.5

Lors de l'ajout des clés étrangères à un modèle que je peux faire:

user = models.ForeignKey(settings.AUTH_USER_MODEL) 

qui me sauve l'importation de l'utilisateur en haut du fichier qui casse quand django.contrib.auth.models.User n'est plus le modèle de l'utilisateur. Mais parfois, lors du test, je dois être en mesure de créer un utilisateur et le meilleur que je suis en mesure de trouver pour cela est

from django.conf import settings 
from django.db.models import get_model 
User = get_model(*settings.AUTH_USER_MODEL.split('.')) 

je peux faire des choses comme:

User.objects.create(username="test") 

dans mon test (certains objets ont des FK liés aux utilisateurs et j'ai besoin d'un de ces objets dans un test).

Cela ne me semble pas particulièrement élégant, mais je ne vois vraiment pas de moyen plus propre de le faire en 1.5.

Ai-je raté quelque chose dans les documents?

Répondre

10

Une façon vous pouvez le faire est:

try: 
    from django.contrib.auth import get_user_model 
except ImportError: # django < 1.5 
    from django.contrib.auth.models import User 
else: 
    User = get_user_model() 
+0

Est-ce que 'get_user_model' existait pas avant 1,5? Sinon, c'est un très bon point. – boatcoder

+0

Non - vérifiez la différence: https://github.com/django/django/blob/1.4/django/contrib/auth/__init__.py et https://github.com/django/django/blob/1.5c2/ django/contrib/auth/__ init__.py – karthikr

5

Rappelez-vous, get_user_model ne peut pas être appelé au niveau du module. En particulier, ne pensez même pas à l'utiliser dans models.py pour définir une relation ForeignKey. Utilisez le paramètre AUTH_USER_MODEL si nécessaire. Sinon, comme je l'ai découvert, vous allez avoir des bogues étranges et difficiles à déboguer où certains modèles ne seront tout simplement pas disponibles. En fait, j'ai eu une situation où l'ajout de print get_user_model() à un certain fichier a causé l'échec d'une autre importation, dans une application django totalement différente.

Si je lis this introduction to get_user_model, je aurais pu sauver moi-même quelques heures ...

+0

Même expérience douloureuse avec le code en cours d'exécution, mais la sphinx-build se plaint terriblement. Le texte qui m'a aidé était dans le manuel de Django: https://docs.djangoproject.com/en/dev/topics/auth/customizing/#django.contrib.auth.get_user_model "De manière générale, vous devriez référencer le modèle User avec le paramètre AUTH_USER_MODEL dans le code qui est exécuté au moment de l'importation get_user_model() ne fonctionne que lorsque Django a importé tous les modèles. " –

+0

Depuis Django 1.11, 'get_user_model' peut maintenant être appelé au niveau du module Voir: https://docs.djangoproject.com/fr/1.11/topics/auth/customizing/#django.contrib.auth.get_user_model –

Questions connexes