使用唯一的电子邮件在 Django 中注册

时间:2020-12-21 12:37:18

标签: python django

我是 Django 的新手,我正在尝试制作我的第一个注册应用程序。我使用了 UserCreationForm。当我运行代码并尝试注册时,如果我向许多用户发送相同的电子邮件,它不会给我任何错误。

我的表单.py

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


class RegisterForm(UserCreationForm):

    class Meta:
        model = User
        fields = ['username', 'email', 'password1', 'password2']

我的views.py

from django.shortcuts import render, redirect
from django.contrib.auth import authenticate, login, logout
from django.contrib import messages

# Create your views here.
from .forms import RegisterForm

def registerUser(request):
     form = RegisterForm()
     if request.method == 'POST':
         form = RegisterForm(request.POST)
         if form.is_valid():
             form.save()
             return redirect('login')

     else:
         form = RegisterForm()
     return render(request, 'register.html', {'form':form})

def loginUser(request):
     if request.method == 'POST':
         username = request.POST.get('username')
         password = request.POST.get('password')

         if username and password:

              user = authenticate(username=username, password=password)

              if user is not None:
                login(request, user)
                return redirect('home')
              else:
                   messages.error(request, 'Username or Password is Incorrect')
        else:
              messages.error(request, 'Fill out all the fields') 

       return render(request, 'login.html', {})

def home(request):
    return render(request, 'home.html', {})


def logoutUser(request):
    logout(request)
    return redirect('home')

def Profile(request):
    return render(request, 'profile.html', {})

1 个答案:

答案 0 :(得分:0)

正如 Harshil Suthar 在评论中所说,覆盖默认用户模型是最佳做法 (https://docs.djangoproject.com/en/3.1/topics/auth/customizing/#a-full-example),但如果您只想在使用时检查唯一电子邮件,则可能需要付出很多努力你的表格。

您可以使用表单的 clean_< 属性 > 方法解决此问题。请注意,它只会在使用此表单时有效。因此,例如,超级用户仍然可以与其他用户拥有相同的电子邮件...

# Other imports...
from django.core.exceptions import ValidationError


class RegisterForm(UserCreationForm):

    class Meta:
        model = User
        fields = ['username', 'email', 'password1', 'password2']

    def clean_email(self):
        email = self.cleaned_data["email"]
        if User.objects.filter(email=email).exists():
            raise ValidationError("An user with this email already exists!")
        return email