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']
我的意见.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', {})
解决方案
正如 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
推荐阅读
- robotframework - 如果方法返回 true,则机器人框架
- java - 如何在录制音频 android studio 时获得实时音频波可视化
- php - 投资组合查询ID Elementor
- python - 创建具有唯一元素的随机 numpy 向量时出现问题?
- css - 我试图在css中并排放置5个标题?
- python - 如何使用 django rest 框架返回嵌套的 json
- react-native - 进行构建时原因:错误= 13,权限被拒绝
- javascript - 获取 JSON API 中的所有数组
- python-3.x - 想在python中将十进制数存储为字符串
- sql - 来自 CTE 的变量的无效操作错误