Étendre User, mot de passe en clair et pas de connexion

a marqué ce sujet comme résolu.
Auteur du sujet

Bonjour !

Je suis débutant en Django, j’esssai d’implémenter un espace membre en utilisant django.contrib.auth.

Tout d’abord j’étend le User de base pour avoir plus de renseignements sur un user :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
from django.db import models
from django.contrib.auth.models import User


class Profil(User):
    user = models.OneToOneField(User, on_delete=models.CASCADE, parent_link=True)
    postal_code = models.CharField(max_length=255)
    facebook_profil = models.URLField(max_length=255)
    make = models.CharField(max_length=255)
    model = models.CharField(max_length=255)
    year = models.CharField(max_length=255)
    photo = models.ImageField(upload_to="")

    def __str__(self):
        return self.user.username



`

Ensuite j’ai mes formulaires pour l’inscription et la connexion :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
from django import forms
from members.models import Profil


class RegisterForm(forms.ModelForm):
    class Meta:
        model = Profil
        exclude = ("is_staff", "groups", "is_active", "is_superuser", "user_permissions", "last_login", "date_joined")
        fields = ["username", "password", "first_name", "last_name", "email", "postal_code", "facebook_profil", "make", "model", "year", "photo"]

class LoginForm(forms.Form):
    username = forms.CharField(label="Nom d'utilisateur", max_length=30)
    password = forms.CharField(label="Mot de passe", widget=forms.PasswordInput)

`

Puis finalement je créer un utilisateur avec une vue générique CreateView, et je le connecte avec une vue générique LoginView :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
from django.shortcuts import render
from django.views.generic import CreateView
from .models import Profil
from .forms import RegisterForm, LoginForm
from django.urls import reverse_lazy
from django.contrib.auth.views import LoginView

class Register(CreateView):
    template_name = "members/register.html"
    model = Profil
    form_class = RegisterForm
    success_url = reverse_lazy('login')

class Login(LoginView):
    form = LoginForm
    template_name = "members/login.html"

Mon problème est que mon utilisateur se créer avec un mot de passe en clair, et ensuite dans la connexion l’authentification échoue, et je crois que c’est justement parce que le mot de passe n’est pas encrypté :

Image utilisateur

Quelqu’un aurait une idée du problème ? Comment hasher mon mot de passe, pourquoi ce n’est pas fait ? Merci !

Édité par CédricVilleneuve

+0 -0

Salut !

Ça fait un moment que je n’ai pas touché à Django, donc je vais peut-être répondre à côté, mais il existe un formulaire tout fait pour permettre aux utilisateurs de se connecter, la doc est disponible ici. Ainsi, tu peux faire quelque chose comme ça.

1
2
3
4
5
from django.contrib.auth.forms import AuthenticationForm

class Login(LoginView):
    form = AuthenticationForm
    template_name = "members/login.html"

Edit : Au temps pour moi, je n’en suis pas sur mais il me semble que le formulaire d’inscription doit spécifier model = User et pas model = Profile (je crois que c’est à la vue qui traite le formulaire de gérer ensuite la création de l’User et de son Profile).

Édité par rezemika

"Les accidents dans un système doivent se produire, mais il n’est pas obligatoire qu’ils produisent pour vous et moi." Laurence Gonzales - Deep Survival

+0 -0

C’est certainement une meilleure idée d’utiliser un OneToOneField dans ton cas.

Sinon, n’oublie pas de spécifier AUTH_USER_MODEL dans tes préférences. D’ailleurs, tu devrais plutôt hériter de AbstractUser.

Edit: j’avais mal vu, tu as mélangé les deux, ce qui ne fait pas sens. Il faut bel et bien hériter de models.Model si tu veux utiliser un OneToOneField.

Édité par dab

+0 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte