Django Formulaire d'enregistrement de l' 'AnonymousUser' objet n'a pas d'attribut 'backend'
J'ai suivantes registre de vue que l'entrée d'un nouvel utilisateur.
Je veux entrer dans le nouvel utilisateur, puis vous connecter automatiquement.
Il enregistre par le biais de l'enregistrement de l'Utilisateur, mais renvoie cette erreur lors de la tentative de connexion:
'AnonymousUser' objet n'a pas d'attribut 'backend'
views.py
def register(request):
if request.method == 'POST':
form = UserRegisterForm(request.POST, error_class=DivErrorList)
if form.is_valid():
form.save()
new_user = authenticate(username=request.POST['username'],password=request.POST['password'])
login(request, new_user)
return HttpResponseRedirect('/production/')
else:
form = UserRegisterForm(error_class=DivErrorList)
return render(request,'register.html', {
'form': form,
})
forms.py
class UserRegisterForm(forms.ModelForm):
class Meta:
model = User
fields = ('username','first_name','last_name','email','password')
password_compare = forms.CharField(max_length=128)
def __init__(self, *args, **kwargs):
super(UserRegisterForm, self).__init__(*args, **kwargs)
self.fields['password_compare'].label = 'Password Again'
self.fields['password'].help_text = ''
self.fields['first_name'].label = 'First Name'
self.fields['last_name'].label = 'Last Name'
self.fields['email'].label = 'E-mail Address'
def clean(self):
cleaned_data = self.cleaned_data
password1 = cleaned_data.get('password', None)
password2 = cleaned_data.get('password_compare', None)
if not (password1):
error_msg = u'This field is required.'
self._errors['password'] = self.error_class([error_msg])
if not (password2):
error_msg = u'This field is required.'
self._errors['password_compare'] = self.error_class([error_msg])
# password fields must match
if password1 != password2:
error_msg = u'Password doesn\'t match the confirmation.'
self._errors['password'] = self.error_class([error_msg])
del cleaned_data['password']
# cannot have a username already existing
try:
existing_user = User.objects.get(username=cleaned_data.get('username'))
error_msg = u'Username already exists.'
self._errors['username'] = self.error_class([error_msg])
del cleaned_data['username']
return cleaned_data
except User.DoesNotExist:
return cleaned_data
OriginalL'auteur dbcole | 2011-10-14
Vous devez vous connecter pour publier un commentaire.
Votre utilisateur ne sera jamais authentifier, parce que vous êtes en train d'enregistrer le mot de passe en texte clair - et
authenticate
attend un mot de passe haché. Vous devriez appeleruser.set_password(password)
sur l'utilisateur nouvellement créé de l'objet avant de l'enregistrer dans la base de données - voir le built-inUserCreationForm
.Utilisateur(attr...) enregistre le mot de passe en clair dans le texte ainsi alors que de l'Utilisateur.objets.create_user(attr...) hache le mot de passe pour vous.
OriginalL'auteur Daniel Roseman
J'ai eu le même message d'erreur pour une nouvelle inscription de l'utilisateur et il m'a laissé frustré pendant une heure.
Il y avait un morceau de code qui a essayé d'ouvrir une session utilisateur immédiatement après l'enregistrement.
Habituellement, il a très bien fonctionné, mais pas cette fois.
Il semblait que
authenticate
retournéNone
, et puis l'appel delogin
avecNone
causé cette exception. Mais j'étais sûr que leUser
a été créé après l'enregistrement.Enfin, j'ai réalisé que ce particulier de connexion de l'utilisateur a été plus de 30 caractères, et le champ de formulaire a pas de validation. La connexion obtenir tronquée dans la base de données, et donc
authenticate
a été appelé pour les non-existant de connexion.OriginalL'auteur Dan Abramov