python - django 中的自定义用户模型。唯一约束失败:users_user.username
问题描述
我正在尝试制作自定义注册表单。主要思想是用户应该使用电子邮件作为登录方法并且能够在配置文件中设置用户名(所以我不想覆盖用户名字段)。内置 django 用户模型的问题是用户名字段是必需的,所以我基于 AbstractUser 制作了自己的模型。现在,当我尝试注册新用户时,我得到“唯一约束失败:users_user.username”。
模型.py
from django.db import models
from django.contrib.auth.models import AbstractUser
class User(AbstractUser):
pass
表格.py
from django import forms
from .models import User
class RegisterForm(forms.ModelForm):
username = forms.CharField(max_length=100, required=False)
email = forms.EmailField(label='', max_length=100, widget=forms.TextInput(attrs={'placeholder': 'email@example.com'}))
password = forms.CharField(label='', max_length=100, widget=forms.PasswordInput(attrs={'placeholder': 'Password'}))
class Meta:
model = User
fields = ['username', 'email', 'password']
视图.py
from django.shortcuts import render, redirect
from django.contrib import messages
from .forms import RegisterForm
def register(request):
if request.method == 'POST':
form = RegisterForm(request.POST)
if form.is_valid():
form.save()
return redirect('trade')
else:
form = RegisterForm()
return render(request, 'users/register.html', {'form': form})
AUTH_USER_MODEL = 'users.User' 已设置
我试图在 models.py 中设置 email unique=True
from django.db import models
from django.contrib.auth.models import AbstractUser
class User(AbstractUser):
email = models.EmailField(unique=True)
现在我得到“视图 users.views.register 没有返回 HttpResponse 对象。它返回 None 而是”。
请记住,这是我自己的第一个 django 项目 :) 已获得帮助!
编辑解决方案:
好吧,我解决了这个问题。所有答案都在 django 文档中(谁愿意)。问题是,如果您像我一样是 python 和 django 的新手,阅读有关自定义用户模型的文档可能会非常不知所措。主要目标是将电子邮件设置为登录方法。为此,您必须在模型中设置 USERNAME_FIELD = 'email'。为了能够做到这一点,你必须让你的模型不是基于 AbstractUser,而是基于 AbstractBaseUser( https://docs.djangoproject.com/en/3.0/topics/auth/customizing/#specifying-a-custom-user -model ) 并重写您创建用户的方式。对我来说似乎很难,但 django 有一个很好的例子,如何在文档末尾做到这一点(https://docs.djangoproject.com/en/3.0/topics/auth/customizing/#a-full-example)。我只是复制了代码,将 'date_of_birth' 替换为 'username' 并得到了我想要的东西,并了解了一些事情是如何在此之上工作的。
解决方案
关于 error "The view users.views.register didn't return an HttpResponse object. It returned None instead"
,这是因为register
没有在所有流程中返回某些内容。在请求是POST
第一个 if 语句为真的情况下,这就是我们所在的分支。如果表单有效,则一切正常,但如果不是,则不返回任何内容。我们不输入 else 部分,因为只有当请求不是时才会发生这种情况,POST
您可以通过执行以下操作来修复它:
def register(request):
if request.method == 'POST':
form = RegisterForm(request.POST)
if form.is_valid():
form.save()
return redirect('trade')
else:
form = RegisterForm()
return render(request, 'users/register.html', {'form': form})
这样,在所有情况下,您都会返回一些东西。
关于原来的错误。由于您是从您那里继承的,AbstractUser
因此您正在继承该username
字段以及与之相关的所有行为。特别是,它仍然需要是唯一的。这是它的定义方式AbstractUser
:
username = models.CharField(
_('username'),
max_length=150,
unique=True,
help_text=_('Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.'),
validators=[username_validator],
error_messages={
'unique': _("A user with that username already exists."),
},
)
如果您向用户名提交空白值,这将给您带来问题。您的表单将允许它,但在数据库级别将不允许它。在那里我会覆盖用户名,只需添加如下内容:
username = models.CharField(
max_length=150,
blank=True,
)
推荐阅读
- codenameone - 从图库加载视频
- python-3.x - 将比例 z 检验应用于数据框中的每条记录
- reactjs - 在 React with Enzyme 中测试 Socket.io 监听器
- c# - 将多个过滤器与 Or 条件组合并将其发送 Simple Odata Client - C#
- r - head() 或 top_n() 函数更改数据集中数值的格式
- mysql - 当我尝试在 sequel pro 中运行此查询时出现错误
- powershell - 使用 foreach 循环执行 powershell 脚本后结果太多
- javascript - 通过 ASIN 获取亚马逊产品图片
- javascript - “var data = jQuery(msg), script;”是什么意思 在javascript中?
- laravel - 如何使用 Laravel 将查询字符串附加到分页链接