J'utilise Django '1.5c1'
. J'ai cette ligne dans mon settings.py:
AUTH_USER_MODEL = 'fileupload.galaxyuser'
Voici mon modèle Galaxyuser
:
class GalaxyUser(models.Model):
id = models.IntegerField(primary_key=True)
create_time = models.DateTimeField(null=True, blank=True)
update_time = models.DateTimeField(null=True, blank=True)
email = models.CharField(max_length=765)
password = models.CharField(max_length=120)
external = models.IntegerField(null=True, blank=True)
deleted = models.IntegerField(null=True, blank=True)
purged = models.IntegerField(null=True, blank=True)
username = models.CharField(max_length=765, blank=True)
form_values_id = models.IntegerField(null=True, blank=True)
disk_usage = models.DecimalField(null=True, max_digits=16, decimal_places=0, blank=True)
class Meta:
db_table = u'galaxy_user'
Je veux m'authentifier à partir du modèle Galaxyuser. Cependant, lorsque je me connecte, j'obtiens cette erreur:
AttributeError: 'Manager' object has no attribute 'get_by_natural_key'
Qu'est-ce que je fais mal?
Modifier:Traceback:
Traceback:
File "/usr/local/lib/python2.6/dist-packages/Django/core/handlers/base.py" in get_response
115. response = callback(request, *callback_args, **callback_kwargs)
File "/home/zurelsoft/workspace/genalytics/fileupload/backend.py" in login_backend
26. user = authenticate(username=username, password=password)
File "/usr/local/lib/python2.6/dist-packages/Django/contrib/auth/__init__.py" in authenticate
59. user = backend.authenticate(**credentials)
File "/usr/local/lib/python2.6/dist-packages/Django/contrib/auth/backends.py" in authenticate
16. user = UserModel.objects.get_by_natural_key(username)
Exception Type: AttributeError at /login_backend/
Exception Value: 'Manager' object has no attribute 'get_by_natural_key'
Vous avez créé un nouveau modèle utilisateur mais vous n'avez pas encore spécifié de gestionnaire pour ce modèle. Si vous n'êtes pas encore familier avec les gestionnaires en Django je suggère de lire d'abord la documentation à ce sujet . Comme le dit Django 1.5 dire ( source ):
Vous devez également définir un gestionnaire personnalisé pour votre modèle utilisateur. Si votre modèle d'utilisateur définit les champs de nom d'utilisateur et de courrier électronique de la même manière que l'utilisateur par défaut de Django, vous pouvez simplement installer UserManager de Django; cependant, si votre modèle utilisateur définit des champs différents, vous devrez définir un gestionnaire personnalisé qui étend BaseUserManager en fournissant deux méthodes supplémentaires:
create_user()
etcreate_superuser()
.
En bref, si votre modèle utilise le même nom d'utilisateur et les mêmes champs de messagerie que le modèle User
de Django, vous pouvez écrire:
from Django.contrib.auth.models import UserManager
class GalaxyUser(models.Model):
id = models.IntegerField(primary_key=True)
create_time = models.DateTimeField(null=True, blank=True)
update_time = models.DateTimeField(null=True, blank=True)
email = models.CharField(max_length=765)
password = models.CharField(max_length=120)
external = models.IntegerField(null=True, blank=True)
deleted = models.IntegerField(null=True, blank=True)
purged = models.IntegerField(null=True, blank=True)
username = models.CharField(max_length=765, blank=True)
form_values_id = models.IntegerField(null=True, blank=True)
disk_usage = models.DecimalField(null=True, max_digits=16, decimal_places=0, blank=True)
objects = UserManager()
class Meta:
db_table = u'galaxy_user'
Vous devrez également sous-classer BaseUserManager
(également dans Django.contrib.auth.models
) et implémentez les méthodes souhaitées. Ensuite, vous devrez l'affecter à la variable objects
de votre modèle.