web-dev-qa-db-fra.com

AttributeError: l'objet 'Manager' n'a pas d'erreur d'attribut 'get_by_natural_key' dans Django?

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'
17
pynovice

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() et create_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.

36
Simeon Visser