• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Django - dane w formie nie są akceptowane?

Object Storage Arubacloud
0 głosów
191 wizyt
pytanie zadane 16 kwietnia 2023 w Python przez tonn204 Mądrala (7,440 p.)

Witam, robię prostą aplikację webową w Django z customowym userem i backendem do logowanie za pomocą maila. Mama taki widok jak poniżej i gdy klikam zaloguj w konsoli wyświetla się błąd "User with this Email already exists." Nie wiem dlaczego skoro nie tworze tu nowego użytkownika a tylko pobieram dane z formy aby ręcznie sie zalgować w widoku "login". Próbwałem pozmieniać coś, żeby w do formy przekazac instancje użytkownika, ale bezskutecznie. Jak mogę to naprawić, żeby można było się zalogowac.

views.py

from django.shortcuts import render, redirect
from django.contrib.auth import authenticate, login as auth_login
from django.contrib.auth import get_user_model
from django.http import HttpResponse
from django.utils.http import urlsafe_base64_decode, urlsafe_base64_encode
from django.utils.encoding import force_bytes, force_str


from .forms import UserRegisterForm, UserLoginForm
from .email_manager import send_confirmation_email
from .tokens import account_activation_token


def login(request):
    if request.method == 'POST':
        form = UserLoginForm(request.POST)
        if form.is_valid():
            email = form.cleaned_data.get('email')
            password = form.cleaned_data.get('password')
            user = authenticate(request, email=email, password=password)
            if user is not None:
                auth_login(request, user)
                return redirect('home')
    else:
        form = UserLoginForm()

    return render(request, 'users/login.html', {'form': form})

def register(request):
    if request.method == 'POST':
        form = UserRegisterForm(request.POST)
        if form.is_valid():
            form.save()
            user = form.save(commit=False)
            user.save()
            send_confirmation_email(request, user)
    else:
        form = UserRegisterForm()

    return render(request, 'users/register.html', {'form': form})


def activate(request, uidb64, token):
    try:
        uid = force_str(urlsafe_base64_decode(uidb64))
        user = get_user_model().objects.get(pk=uid)
    except(TypeError, ValueError, OverflowError, get_user_model().DoesNotExist):
        user = None

    if user is not None and account_activation_token.check_token(user, token):
        user.email_confirmed = True
        user.save()
        auth_login(request, user)
    else:
        return HttpResponse('Activation link is invalid!')

forms.py

from django import forms
from .models import ShopUser
from django.contrib.auth.forms import UserCreationForm

class UserRegisterForm(UserCreationForm):
    email = forms.EmailField()

    class Meta:
        model = ShopUser
        fields = ['first_name', 'last_name', 'email', 'phone_number', 'city', 'zip_code', 'street', 'building_number', 'password1', 'password2']


class UserLoginForm(forms.ModelForm):
    email = forms.EmailField()
    password = forms.PasswordInput()

    class Meta:
        model = ShopUser
        fields = ['email', 'password']

models.py

from django.db import models
from django.contrib.auth.models import AbstractUser


class ShopUser(AbstractUser):
    email = models.EmailField(unique=True)
    phone_number = models.CharField(max_length=9)
    city = models.CharField(max_length=100)
    zip_code = models.CharField(max_length=10)
    street = models.CharField(max_length=100)
    building_number = models.IntegerField(default=1)
    email_confirmed = models.BooleanField(default=False)

    def __str__(self):
        return self.email

 

1 odpowiedź

0 głosów
odpowiedź 16 kwietnia 2023 przez adrian17 Ekspert (344,860 p.)

Nie wiem jak z resztą kodu i tą konfuzją między rejestracją a logowaniem, ale tutaj:

            form.save()
            user = form.save(commit=False)
            user.save()

bez cienia wątpliwości próbujesz dwukrotnie stworzyć takiego samego użytkownika, więc drugi raz się nie uda. Nie wiem po co te wielokrotne .save().

komentarz 17 kwietnia 2023 przez tonn204 Mądrala (7,440 p.)

Znalazłem problem, zamiast forms.ModelForm powinienem użyć forms.Form bo nie edytuje żadnego modelu. Dodatkowo w funkcji login musiałem ustawić argument backend,  z racji na to że używam customowego backendu. Nie rozumiem tylko dlaczego jeżeli chce wykorzystać mój backend to do funkcji muszę przekazać ten deafultowy, żeby wszystko działało.

def login(request):
    if request.method == 'POST':
        form = UserLoginForm(request.POST)
        if form.is_valid():
            email = form.cleaned_data.get('email')
            password = form.cleaned_data.get('password')
            user = authenticate(request, email=email, password=password)
            if user is not None:
                auth_login(request, user, backend='django.contrib.auth.backends.ModelBackend')
                return redirect('shop-home')
    else:
        form = UserLoginForm()

    return render(request, 'users/login.html', {'form': form})

 

Podobne pytania

0 głosów
2 odpowiedzi 234 wizyt
0 głosów
1 odpowiedź 203 wizyt
pytanie zadane 8 marca 2023 w Python przez tonn204 Mądrala (7,440 p.)
0 głosów
1 odpowiedź 117 wizyt

92,538 zapytań

141,377 odpowiedzi

319,456 komentarzy

61,923 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...