0 Daumen
159 Aufrufe

Wenn ich versuche, einen Benutzer zu registrieren, indem ich das, was ich in [Building a Custom User Model with Extended Fields youtube tutorial][1] gelernt habe, anpasse, kann ich mich danach nicht mehr anmelden, obwohl ich dasselbe Passwort angegeben habe. Ich kann mich jedoch bei jedem Benutzer anmelden, den ich über die Befehlszeile erstellt habe. Hier ist der Teil der views.py, der sich mit der Benutzerregistrierung beschäftigt:

views.py
from django.shortcuts import render, redirect, get_object_or_404
from django.contrib.auth.forms import UserCreationForm, AuthenticationForm
from django.contrib.auth import get_user_model
from django.conf import settings
User = settings.AUTH_USER_MODEL
from django.db import IntegrityError
from django.contrib.auth import login, logout, authenticate
from .forms import TodoForm
from .models import Todo
from django.utils import timezone
from django.contrib.auth.decorators import login_required

def home(request):
return render(request, 'todo/home.html')

def signupuser(request):
if request.method == 'GET':
    return render(request, 'todo/signupuser.html', {'form':UserCreationForm()})
else:
    if request.POST['password1'] == request.POST['password2']:
        try:
            db = get_user_model()
            user = db.objects.create_user(request.POST['email'], request.POST['username'],
                                        request.POST['firstname'], request.POST['company'], request.POST['mobile_number'],
                                        password=request.POST['password1'])
            user.save()
            login(request, user)
            return redirect('currenttodos')



Der Benutzer ist immer noch registriert, aber ich kann mich nicht mit dem angegebenen Passwort anmelden, ich komme nicht zu currenttodos für alle außer dem Benutzer, den ich über die Befehlszeile erstellt habe ... Was könnte der Grund dafür sein?

Hier ist mein benutzerdefiniertes Benutzermodell:

models.py:

from django.db import models
from django.contrib.auth.models import AbstractBaseUser, PermissionsMixin, BaseUserManager

class CustomAccountManager(BaseUserManager):

  def create_superuser(self, email, user_name, first_name, password, **other_fields):

      other_fields.setdefault('is_staff', True)
      other_fields.setdefault('is_superuser', True)
      other_fields.setdefault('is_active', True)

      if other_fields.get('is_staff') is not True:
          raise ValueError(
              'Superuser must be assigned to is_staff=True.')
      if other_fields.get('is_superuser') is not True:
          raise ValueError(
              'Superuser must be assigned to is_superuser=True.')

      return self.create_user(email, user_name, first_name, password, **other_fields)

  def create_user(self, email, user_name, first_name, company, mobile_number, password, **other_fields):

      if not email:
          raise ValueError(('You must provide an email address'))

      email = self.normalize_email(email)
      user = self.model(email=email, user_name=user_name, first_name=first_name,
                      company=company, mobile_number=mobile_number, password=password, **other_fields)
      user.set_password(password)
      user.save()
      return user

class Newuser(AbstractBaseUser, PermissionsMixin):
  email = models.EmailField(('email address'), unique=True)
  user_name = models.CharField(max_length=150, unique=True)
  first_name = models.CharField(max_length=150, blank=True)
  mobile_number = models.CharField(max_length=10)
  company = models.CharField(max_length=5)
  is_staff = models.BooleanField(default=False)
  is_active = models.BooleanField(default=False)

  objects = CustomAccountManager()

  USERNAME_FIELD = 'email'
  REQUIRED_FIELDS = ['user_name', 'first_name', 'mobile_number']

  def __str__(self):
      return self.user_name


settings.py

AUTH_USER_MODEL = 'todo.NewUser'


[1]:


Avatar von

1 Antwort

0 Daumen

Antwort mit KI erzeugt

Problemformulierung

Das Problem, das beschrieben wird, betrifft die Registrierung und Authentifizierung eines neuen Benutzers in einer Django-Anwendung mit einem benutzerdefinierten Benutzermodell. Das Problem tritt bei der Anmeldung auf: ein Benutzer, der über das Registrierungsformular erstellt wurde, kann sich nicht anmelden, obwohl das Passwort korrekt eingegeben wurde und keine Fehler während der Registrierung gemeldet werden.

Analyse des Problems

Das Hauptproblem ist hier, dass Benutzer, die über das Registrierungsformular erstellt werden, sich nicht einloggen können, obwohl sich Benutzer, die über die Befehlszeile erstellt wurden, problemlos einloggen können. Dies deutet darauf hin, dass es möglicherweise ein Problem mit der Methode gibt, wie das Passwort im benutzerdefinierten Registrierungsprozess gesetzt oder gespeichert wird.

Überprüfung der create_user Methode

Die Methode create_user im benutzerdefinierten Manager sieht folgendermaßen aus:

python
def create_user(self, email, user_name, first_name, company, mobile_number, password, **other_fields):
    if not email:
        raise ValueError(('You must provide an email address'))

    email = self.normalize_email(email)
    user = self.model(
        email=email, 
        user_name=user_name, 
        first_name=first_name, 
        company=company,
        mobile_number=mobile_number, 
        password=password, 
        **other_fields
    )
    user.set_password(password)
    user.save()
    return user


Die Methode setzt das Passwort mit user.set_password(password). Das sieht korrekt aus, da die Methode set_password das Passwort verschlüsselt und in der Datenbank speichert.

Überprüfung der signupuser View

Der Teil der views.py-Datei, der für die Benutzerregistrierung verantwortlich ist, sieht folgendermaßen aus:

python
def signupuser(request):
    if request.method == 'GET':
        return render(request, 'todo/signupuser.html', {'form': UserCreationForm()})
    else:
        if request.POST['password1'] == request.POST['password2']:
            try:
                db = get_user_model()
                user = db.objects.create_user(
                    request.POST['email'], 
                    request.POST['username'],
                    request.POST['firstname'], 
                    request.POST['company'], 
                    request.POST['mobile_number'],
                    password=request.POST['password1']
                )
                user.save()
                login(request, user)
                return redirect('currenttodos')


Der Code verwendet create_user korrekt. Aber es gibt einen subtilen Fehler: Die Reihenfolge und Anzahl der Argumente für create_user ist nicht korrekt. create_user erwartet email, user_name, first_name, company, mobile_number, password und weitere Felder, falls notwendig. Im Aufruf von create_user fehlen einige benannte Argumente und deren Reihenfolge ist nicht klar definiert.

Korrektur des Aufrufs zum Erstellen des Benutzers

Wir müssen sicherstellen, dass wir alle erwarteten Argumente in der richtigen Reihenfolge und mit den richtigen Namen übergeben. Außerdem sollten wir sicherstellen, dass wir alle nötigen Felder korrekt übergeben.

python
def signupuser(request):
    if request.method == 'GET':
        return render(request, 'todo/signupuser.html', {'form': UserCreationForm()})
    else:
        if request.POST['password1'] == request.POST['password2']:
            try:
                db = get_user_model()
                user = db.objects.create_user(
                    email=request.POST['email'],
                    user_name=request.POST['username'],
                    first_name=request.POST['firstname'], 
                    company=request.POST['company'], 
                    mobile_number=request.POST['mobile_number'], 
                    password=request.POST['password1']
                )
                user.save()
                login(request, user)
                return redirect('currenttodos')
            except IntegrityError:
                return render(request, 'todo/signupuser.html', {'form': UserCreationForm(), 'error': 'That email has already been taken. Please choose a new email address.'})
        else:
            return render(request, 'todo/signupuser.html', {'form': UserCreationForm(), 'error': 'Passwords did not match.'})


Zusammenfassung

Durch die Korrektur des Aufrufs der create_user Funktion in der signupuser-View und sicherzustellen, dass alle nötigen Parameter korrekt übergeben werden, sollte das Problem der Authentifizierung gelöst werden. Die Passwörter werden jetzt ordnungsgemäß verschlüsselt und gespeichert, wodurch sich die Benutzer korrekt anmelden können.
Avatar von 4,6 k

Ein anderes Problem?

Stell deine Frage

Willkommen bei der Stacklounge! Stell deine Frage einfach und kostenlos

x
Made by a lovely community