Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python django中的自定义用户模型。唯一约束失败:users\u user.username_Python_Django - Fatal编程技术网

Python django中的自定义用户模型。唯一约束失败:users\u user.username

Python django中的自定义用户模型。唯一约束失败:users\u user.username,python,django,Python,Django,我正在试着做一份定制登记表。主要思想是用户应该使用电子邮件作为登录方法,并且能够在概要文件中设置用户名(所以我不想覆盖用户名字段)。内置django用户模型的问题是用户名字段是必需的,所以我基于AbstractUser创建了自己的模型。现在,当我尝试注册一个新用户时,我得到“唯一约束失败:users\u user.username” models.py from django.db import models from django.contrib.auth.models import Abst

我正在试着做一份定制登记表。主要思想是用户应该使用电子邮件作为登录方法,并且能够在概要文件中设置用户名(所以我不想覆盖用户名字段)。内置django用户模型的问题是用户名字段是必需的,所以我基于AbstractUser创建了自己的模型。现在,当我尝试注册一个新用户时,我得到“唯一约束失败:users\u user.username”

models.py

from django.db import models
from django.contrib.auth.models import AbstractUser

class User(AbstractUser):
    pass
from django.db import models
from django.contrib.auth.models import AbstractUser

class User(AbstractUser):
    email = models.EmailField(unique=True)
forms.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']
views.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()并重写创建用户的方式。对我来说似乎很难,但django在文档()的末尾有一个很好的例子,说明了如何正确地做到这一点。我只是复制了代码,用“用户名”替换了“出生日期”,得到了我想要的,再加上一点了解如何在上面工作。

关于错误
“view users.views.register没有返回HttpResponse对象。相反,它没有返回任何对象”
,发生这种情况是因为
register
不会在所有流中返回某些内容。在请求为
POST
的情况下,第一个if语句为true,因此这就是我们所在的分支。如果表单有效,则一切正常;如果表单无效,则不返回任何内容。我们不输入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,
    )

关于错误
“view users.views.register没有返回HttpResponse对象。它反而返回了None”
,这是因为
register
没有在所有流中返回某些内容。在请求为
POST
的情况下,第一个if语句为true,因此这就是我们所在的分支。如果表单有效,则一切正常;如果表单无效,则不返回任何内容。我们不输入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,
    )

根据建议,我添加了username=models.CharField(max_length=150,blank=True),现在当我尝试运行服务器或进行迁移时,我看到:“(auth.E003)‘User.username’必须是唯一的,因为它被命名为‘username_字段’。”我放弃了,尝试设置username_FIELD=email,得到了:“(auth.E002)自定义用户模型名为“USERNAME\u field”的字段不能包含在“REQUIRED\u FIELDS”中。“根据建议,我现在添加了USERNAME=models.CharField(max\u length=150,blank=True),当我尝试运行服务器或进行迁移时,我看到:”(auth.E003)“User.username”必须是唯一的,因为它被命名为“username\u字段”。“我放弃了,尝试设置username\u FIELD=email,结果得到:“(auth.E002)自定义用户模型中名为“username\u FIELD”的字段不能包含在“必需的\u字段”中。”