我是 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', {})
答案 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