2

J'utilise en vue de créer de nouveaux utilisateurs dans Django. Et puis j'ai une autre vue de les connecter.Les nouveaux utilisateurs ne peuvent pas se connecter. Django

Mais quand je crée un utilisateur, et je tente de me connecter avec authenticate (nom d'utilisateur = username_post, mot de passe = password_post), je reçois Aucun, il affiche dans le modèle 'Mauvais nom d'utilisateur ou mot de passe.'.

Dans ma base de données, je vois de nouveaux registres chaque fois que je crée un nouvel utilisateur. Cependant, comme le mot de passe est crypté, je ne peux pas dire si le problème est la vue de connexion, ou la vue du registre.

Cependant, le super utilisateur que j'ai créé via la ligne de commande après la première installation de django, est capable de se connecter sans problème, ce qui me fait penser que le problème est lorsque je crée l'utilisateur.

Ce sont mes vues Connexion et inscription:

class Login(View): 
    form = LoginForm() 
    message = None 
    template = 'settings/blog_login.html' 

    def get(self, request, *args, **kwargs): 
     if request.user.is_authenticated(): 
      return redirect('settings:index') 
     return render(request, self.template, self.get_context()) 

    def post(self, request, *args, **kwargs): 
     username_post = request.POST['username'] 
     password_post = request.POST['password'] 
     user = authenticate(username=username_post, password=password_post) 
     if user is not None: 
      login(request, user) 
      return redirect('settings:index') 
     else: 
      self.message = 'Wrong username or password.' 
      return render(request, self.template, self.get_context()) 

    def get_context(self): 
     return {'form': self.form, 'message': self.message} 


class Register(CreateView): 
    success_url = reverse_lazy('settings:login') 
    model = User 
    template_name = 'settings/blog_register.html' 
    form_class = RegisterForm 

    def form_valid(self, form): 
     self.object = form.save(commit=False) 
     self.object.set_password(self.object.password) 
     self.object.save() 
     return HttpResponseRedirect(self.get_success_url()) 

Et ce sont mes formes:

class LoginForm(forms.Form): 
    username = forms.CharField(max_length=20, label='Username') 
    password = forms.CharField(label='Password', widget=forms.PasswordInput()) 


class RegisterForm(forms.ModelForm): 
    username = forms.CharField(max_length=20, label='Username') 
    password1 = forms.CharField(label='Password', widget=forms.PasswordInput(), 
           error_messages={'required': 'Required field.', 
               'unique': 'Username already used.', 
               'invalid': 'Not valid username.'}) 
    password2 = forms.CharField(label='Retype password', widget=forms.PasswordInput(), 
           error_messages={'required': 'Required field.'}) 
    email = forms.EmailField(error_messages={'required': 'Required field.', 
              'invalid': 'Invalid email.'}) 

    def clean(self): 
     clean_data = super(RegisterForm, self).clean() 
     password1 = clean_data.get('password1') 
     password2 = clean_data.get('password2') 
     if password1 != password2: 
      raise forms.ValidationError('Passwords are different.') 
     return self.cleaned_data 

    def clean_email(self): 
     email = self.cleaned_data.get('email') 
     username = self.cleaned_data.get('username') 
     if email and User.objects.filter(email=email).exclude(
       username=username).exists(): 
      raise forms.ValidationError('Email already used.') 
     return email 

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

S'il vous plaît, laissez-moi savoir si vous avez besoin de plus d'informations.

Répondre

2

Vous n'avez pas un champ appelé « mot de passe » dans votre formulaire - vous avez juste « password1 » et « password2 » - donc rien est enregistré au champ de mot de passe réel de l'objet modèle. Alors, quand vous faites self.object.set_password(self.object.password), vous configurez en fait un mot de passe vide.

Au lieu de cela, vous devriez obtenir la valeur du champ password1 de votre formulaire:

self.object.set_password(self.form.cleaned_data['password1']) 
+0

Vous avez raison, je n'aurais pas remarqué si elle n'a pas été pour votre aide. Je viens d'utiliser 'form.cleaned_data [ 'password1']' 'sans self'. Et maintenant, il fonctionne parfaitement – JPYamamoto