AttributeError: 'AnonymousUser' object has no attribute '_meta'
Salut à nouveau, petit problème quand je tente d'inscrire un shopper depuis la vue signup:
-
j'ai tout modifié de façon à remplacer "username" par "email"
-
le shopper est créé en BDD mais le programme plante au moment de
login(request, user)=> en supprimant cette instruction il n'y a plus d'erreur! -
Le message est celui indiqué dans le titre de ma question
Qu'est ce qui peut provoquer cette erreur? Je précise que via le shell ou la commande superuser tout fonctionne.
Merci!!
Ali
le traceback:
Internal Server Error: /signup/
Traceback (most recent call last):
File "C:\Users\mahfoual\OPC_DRF\e-commerce_docstring\lib\site-packages\django\core\handlers\exception.py", line 55, in inner
response = get_response(request)
File "C:\Users\mahfoual\OPC_DRF\e-commerce_docstring\lib\site-packages\django\core\handlers\base.py", line 197, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "C:\Users\mahfoual\formation_doctsring\e-commerce_docstring\accounts\views.py", line 33, in signup
login(request, user)
File "C:\Users\mahfoual\OPC_DRF\e-commerce_docstring\lib\site-packages\django\contrib\auth\__init__.py", line 138, in login
request.session[SESSION_KEY] = user._meta.pk.value_to_string(user)
File "C:\Users\mahfoual\OPC_DRF\e-commerce_docstring\lib\site-packages\django\utils\functional.py", line 268, in inner
return func(_wrapped, *args)
AttributeError: 'AnonymousUser' object has no attribute '_meta'
[28/Apr/2024 21:01:10] "POST /signup/ HTTP/1.1" 500 75572
salut Kévin, le voici :
from django.contrib.auth import get_user_model, login, logout, authenticate
from django.contrib.auth.forms import get_user_model
from django.shortcuts import render, redirect
from django.views.generic import TemplateView
User = get_user_model() # on récupère le modèle utilisateur
# Vue d'inscription basée sur les classes
# class SignUpView(TemplateView):
# template_name = 'accounts/signup.html'
#
# def post(self, request, *args, **kwargs):
# # on récupère username et password
# email = request.POST.get('email')
# password = request.POST.get('password')
# # on crée l'utilisateur à partir du manager 'objects' de la classe User
# user = User.objects.create_user(email=email, password=password)
# # on connecte l'utilisateur nouvellement crée
# login(request, user)
# return redirect('index')
def signup(request):
if request.method == 'POST': # si la requête est de type POST
# on récupère email et password
email = request.POST.get('email')
password = request.POST.get('password')
# on crée l'utilisateur à partir du manager 'objects' de la classe User (Shopper)
user = User.objects.create_user(email=email, password=password)
# on connecte l'utilisateur nouvellement crée
# login(request, user)
return render(request, 'accounts/signup.html')
def login_user(request):
if request.method == 'POST':
username = request.POST.get('username')
password = request.POST.get('password')
user = authenticate(username=username, password=password)
if user:
login(request, user)
return redirect('index')
return render(request, 'accounts/login.html')
def logout_user(request):
print(f" {request.user.username} est connecté? {request.user.is_authenticated}")
logout(request)
return redirect('index')
Je pense qu'ici le problème vient tout simplement du fait qu'AnonymousUser (un utilisateur anonyme donc) n'est pas un utilisateur "valide". Il ne correspond à aucun utilisateur présent dans ta base de données.
Sans trop vouloir m'avancer, je dirais que la fonction authenticate qui regarde si ton utilisateur est un utilisateur valide ne reconnaît pas l'utilisateur et pars donc du principe que c'est un utilisateur anonyme, ce qui pose un problème quand tu essayes de te connecter via la fonction login, car l'utilisateur n'existe techniquement pas et n'as pas de propriété, tu ne peux donc pas l'utiliser pour te connecter ou afficher ses informations par exemple.
Alors peut-être cela vient du fait que tu as changé le "username" par un "email" pour enregistrer un utilisateur et que derrière tu réutilises un username dans ta fonction de login pour te connecter ? Essayes de passer les deux en email ou en username, suivant ton choix, mais que derrière tout soit basé sur ton choix et pas uniquement certains éléments.
Si tu choisis d'utiliser un email plutôt qu'un username à un endroit, pense à vérifier que c'est bien un email qui est utilisé partout désormais (y compris dans ta base de données) !
Merci Kevin. Le problème semble venir de la vue signup avec la fonction importée 'login' qui ne prend en paramètres que 'request' et 'user'.
Le changement d'identifiant n'est pas un choix perso mais fait partie de ce cours, qui à la fin ne montre l'inscription basée sur l'email que via le shell ou 'createsuperuser', pas via la vue signup!
'authenticate' est utilisée dans la vue 'login_user' que je n'utilise pas dans cet exemple.
Merci pour ton aide.
Bonjour Kevin, à vrai dire ma question n'est pas résolue et reste posée:
Thibault nous explique dans la vidéo comment changer de modèle d'utilisateur et d'adapter le manager, et cela crée un bug au niveau de la vue signup qu'on a définie dans ce cours (avec la fonction importée 'login'). Comment résoudre ce problème avec la vue 'signup'??
Je comprends bien que si dès le départ on opte pour une identification à base de l'email cela pourrait éviter ces erreurs, mais j'aimerais savoir comment dans ce cours on peut passer outre puisque ce n'est pas abordé. Faut-il modifier login(request, user) ? Autre chose?
Merci.
Ali
Salut !
Est-ce que tu peux mettre le code de ton modèle Utilisateur ? Il semble effectivement y avoir un problème lors de la création de l'utilisateur dans ta méthode create_user, il faut vérifier avant d'utiliser login à quoi correspond l'utilisateur que tu récupères dans la variable user, c'est peut-être tout simplement un return que tu as oublié dans ta méthode.
Inscris-toi
(c'est gratuit !)
Tu dois créer un compte pour participer aux discussions.
Créer un compte