Python 如何在Django项目中设置唯一的邮件注册?
我在测试我的注册视图,我注意到如果我尝试使用alreaxy现有用户名注册,我会得到一个错误;如果我尝试使用现有的电子邮件注册,应用程序将允许我这样做 显然,我不希望有人在我的网站上用同一封电子邮件注册多个帐户。我是Django的新手,因为我注意到表单会检查用户名是否已经存在,所以我想它会对email字段做同样的检查 我真的不知道该怎么做,我应该在我的观点上工作还是在表格上工作?我怎样才能让它在数据库中循环并找到是否已经注册了电子邮件?我原以为Python 如何在Django项目中设置唯一的邮件注册?,python,django,django-views,django-urls,Python,Django,Django Views,Django Urls,我在测试我的注册视图,我注意到如果我尝试使用alreaxy现有用户名注册,我会得到一个错误;如果我尝试使用现有的电子邮件注册,应用程序将允许我这样做 显然,我不希望有人在我的网站上用同一封电子邮件注册多个帐户。我是Django的新手,因为我注意到表单会检查用户名是否已经存在,所以我想它会对email字段做同样的检查 我真的不知道该怎么做,我应该在我的观点上工作还是在表格上工作?我怎样才能让它在数据库中循环并找到是否已经注册了电子邮件?我原以为email=form.cleaned\u data.g
email=form.cleaned\u data.get('email')
会奏效,但事实并非如此。
感谢您的帮助
以下是我的看法:
def register(request):
if request.method == "POST":
form = NewUserForm(request.POST)
if form.is_valid():
user = form.save()
username = form.cleaned_data.get('username')
email = form.cleaned_data.get('email')
messages.success(request, f"New Account Created: {username}")
login(request, user)
messages.info(request, f"You are now logged in as {username}")
return redirect("main:homepage")
else:
for msg in form.error_messages:
messages.error(request, f"{msg}: {form.error_messages[msg]}")
form = NewUserForm
return render(request,
"main/register.html",
context={"form":form})
以下是表格:
class NewUserForm(UserCreationForm):
email = forms.EmailField(required=True)
class Meta:
model = User
fields = ("username", "email", "password1", "password2")
def save(self, commit=True):
user = super(NewUserForm, self).save(commit=False)
user.email = self.cleaned_data['email']
if commit:
user.save()
return user
我认为最好的选择是编写自己的用户模型,这将允许您添加对电子邮件的唯一限制,您可以查看比较用户模型中提供的电子邮件地址与电子邮件地址
if form.is_valid():
user = form.save()
username = form.cleaned_data.get('username')
email = form.cleaned_data.get('email')
if User.objects.filter(email__exact=email).count() == 0:
messages.success(request, f"New Account Created: {username}")
login(request, user)
messages.info(request, f"You are now logged in as {username}")
return redirect("main:homepage")
else:
return HttpResponse('This email address is already registered ')
嘿我刚试过,不幸的是它似乎不起作用。我正在努力找出错误所在!请参考,希望有帮助。