2 votes

Le gestionnaire n'est pas disponible ; 'auth.User' a été remplacé par 'polls.User'.

J'ai créé une version différente du modèle Utilisateur où il n'y a pas de champ nom d'utilisateur et j'essaie maintenant de mettre en place une fonctionnalité de connexion, mais j'obtiens toujours l'erreur suivante

Manager isn't available; 'auth.User' has been swapped for 'polls.User'

J'ai fait des recherches sur le reste de ce site et j'ai essayé de mettre en œuvre la fonctionnalité ci-dessous pour résoudre le problème, mais en vain.

from django.contrib.auth import get_user_model

User = get_user_model()

Voici le reste de mes fichiers

Points de vue

    from django.http import HttpResponse
    from django.shortcuts import get_object_or_404, render, render_to_response, redirect
    from django.contrib.auth.decorators import login_required
    from django.contrib.auth import login, authenticate
    from django.shortcuts import render, redirect

    from polls.forms import SignUpForm
    from django.contrib.auth import get_user_model

    User = get_user_model()

    @login_required
    def home(request):
        return render(request, 'home.html')

    def signup(request):
        if request.method == 'POST':
            form = SignUpForm(request.POST)
            if form.is_valid():
                form.save()
                username = None
                raw_password = form.cleaned_data.get('password1')
                user = authenticate(password=raw_password)
                login(request, user)
                return redirect('home')
        else:
            form = SignUpForm()
        return render(request, 'signup.html', {'form': form})

formulaires

from django import forms
from django.contrib.auth.forms import UserCreationForm
from django.contrib.auth.models import User

class SignUpForm(UserCreationForm):
    first_name = forms.CharField(max_length=30, required=False, help_text='Optional.')
    last_name = forms.CharField(max_length=30, required=False, help_text='Optional.')
    email = forms.EmailField(max_length=254, help_text='Required. Inform a valid email address.')
    username = None

    class Meta:
        model = User
        fields = ('first_name', 'last_name', 'email', 'password1', 'password2', )

modèles

from django.db import models
from django.contrib.auth.models import AbstractUser, BaseUserManager
from django.db import models
from django.utils.translation import ugettext_lazy as _

class UserManager(BaseUserManager):
    """Define a model manager for User model with no username field."""

    use_in_migrations = True

    def _create_user(self, email, password, **extra_fields):
        """Create and save a User with the given email and password."""
        if not email:
            raise ValueError('The given email must be set')
        email = self.normalize_email(email)
        user = self.model(email=email, **extra_fields)
        user.set_password(password)
        user.save(using=self._db)
        return user

    def create_user(self, email, password=None, **extra_fields):
        """Create and save a regular User with the given email and password."""
        extra_fields.setdefault('is_staff', False)
        extra_fields.setdefault('is_superuser', False)
        return self._create_user(email, password, **extra_fields)

    def create_superuser(self, email, password, **extra_fields):
        """Create and save a SuperUser with the given email and password."""
        extra_fields.setdefault('is_staff', True)
        extra_fields.setdefault('is_superuser', True)

        if extra_fields.get('is_staff') is not True:
            raise ValueError('Superuser must have is_staff=True.')
        if extra_fields.get('is_superuser') is not True:
            raise ValueError('Superuser must have is_superuser=True.')

        return self._create_user(email, password, **extra_fields)

class User(AbstractUser):
    """User model."""

    username = None
    email = models.EmailField(_('email address'), unique=True)

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = []

    objects = UserManager()

Si quelqu'un peut nous éclairer à ce sujet, nous l'en remercions vivement.

13voto

Håken Lid Points 10106

Dans votre forms.py vous devez également modifier

from django.contrib.auth.models import User

à

from django.contrib.auth import get_user_model

User = get_user_model()

Cela vaut pour tout ce que vous utilisez User . La trace de l'erreur vous indiquera exactement où l'erreur a été provoquée. Lorsque vous demandez de l'aide pour le débogage, incluez toujours la traceback dans la question.

1voto

Vitor Freitas Points 500

Édité : Pas de problème, voir la réponse de Håken Lid. J'ai mal interprété le problème.

Néanmoins, vous devez également corriger le code ci-dessous


Cela dépend de la version de Django que vous utilisez, mais le problème se trouve dans cette ligne :

user = authenticate(password=raw_password)

Vous devez également transmettre le nom d'utilisateur :

user = authenticate(username='john', password='secret')

Ensuite, ensuite authenticate renverra soit un User ou None .

if user is not None:
    login(request, user)
else:
    # authenticated failed

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X