当前位置: 首页 > 知识库问答 >
问题:

重复的密钥值违反了唯一约束“验证用户用户名密钥”详细信息:密钥(用户名)=(无)已经存在

佟嘉祯
2023-03-14

我想使用自定义寄存器模型注册用户,但我一直收到以下错误:

重复的键值违反了唯一约束“auth_user_username_key”详细信息:键(username)=(无)已存在

我如何修复这个错误。

这是我到目前为止创建的代码:

在 urls.py 我为各个页面创建URL配置。

from django.conf.urls import url
from django.contrib.auth.views import login


from . import views

urlpatterns = [

    url(r'^$', views.nest, name = 'nest'),

    url(r'^login/$', login, {'template_name' : 'Identities/login.html'}, name = 'login'),

    url(r'^register/$', views.register, name = 'register'),
]

形式。py我创建自定义注册表单。

from django import forms
from django.contrib.auth.models import User
from django.contrib.auth.forms import UserCreationForm

# Create custom user registration


class CreateAccountForm(UserCreationForm):

    email = forms.EmailField(required = True)


    class Meta:

        model = User

        fields = (

            'first_name',
            'last_name',
            'email',
            'password1',
            'password2'
        )

        def save(self, commit = True):
            user = super(CreateAccountForm, self).save(commit = False)
            user.first_name = self.cleaned_data['first_name']
            user.last_name = self.cleaned_data['last_name']
            user.email = self.cleaned_data['email']

            if commit:

                user.save()

            return user

views.py我创建了寄存器视图函数。

from django.shortcuts import render, redirect
from Identities.forms import CreateAccountForm

# Create your views here.

def nest(request):
    return render(request, 'Identities/nest.html')


def register(request):

    if request.method == 'POST':

        form = CreateAccountForm(request.POST)

        if form.is_valid():
            form.save()

        else:
            return redirect(reverse('Identities:logout'))

    else:

        form = CreateAccountForm()
        var = {'form' : form}
        return render(request, 'Identities/create_account.html', var)

共有2个答案

龙华翰
2023-03-14

你真的应该试试下面的东西。在这里,我已将用户名包含在表单字段中。由于用户名是唯一的,因此应将其包含在表单字段中。在保存方法中,self.cleaned_data。get(“username”,None)如果请求中没有发布任何内容,则会将None带到username字段。如果没有给定值,则db期望为None,但如果不在save方法中指定它,它将接收空字符串,这将导致重复键错误。请注意,Django不会将空值存储为None,而是使用空字符串。

from django import forms
from django.contrib.auth.models import User
from django.contrib.auth.forms import UserCreationForm

# Create custom user registration


class CreateAccountForm(UserCreationForm):

    email = forms.EmailField(required = True)


    class Meta:

        model = User

        fields = (
            'username',
            'first_name',
            'last_name',
            'email',
            'password1',
            'password2'
        )

        def save(self, commit = True):
            user = super(CreateAccountForm, self).save(commit = False)
            user.username = self.cleaned_data.get("username", None)
            user.first_name = self.cleaned_data.get("first_name", None)
            user.last_name = self.cleaned_data.get("last_name", None)
            user.email = self.cleaned_data.get("email", None)

            if commit:

                user.save()

            return user
郭修平
2023-03-14

您需要在表单中包含用户名。因为用户名是唯一字段,不能在表单中排除。如果您在表单中将其排除,则需要通过为每个用户生成唯一用户名来处理,这有点繁琐。

class CreateAccountForm(UserCreationForm):
    email = forms.EmailField(required = True)

    class Meta:
        model = User

        fields = (
             'username'
             'first_name',
             'last_name',
             'email',
             'password1',
             'password2'
        )
   . . . . . .
   . . . . . .
 类似资料:
  • 用户:用户名=>{密码:哈希,年龄:45} 用户:0=>{USERNAME:USERNAME,password:HASH,年龄:45} 请注意,我希望通过名称查找用户,因此需要第二组键值来将用户名与ID相关联。 考虑到每个用户名都是唯一的,并且必须是字母数字的,是否有任何特殊的原因来说明使用ID系统可能是有益的。 附言。由于Redis处理哈希的方式,我实际上不确定这两种方法之间的内存差异,所以关于

  • 问题内容: 我有一个字段,例如,在表中应该是唯一的。 使用Spring / Hibernate验证进行验证的最佳方法是什么? 问题答案: 一种可能的解决方案是创建自定义约束(和相应的验证器)。并要查找数据库中的现有记录,请提供(或Hibernate)to 的实例。 EntityManagerAwareValidator ConstraintValidatorFactoryImpl 唯一键 Uniq

  • 数据供应商为使用其SFTP服务器请求了公共SSH密钥。他们向我们提供了: 用户名 密码 主机名 端口 我正在尝试使用私钥和用户名/密码在php中使用流包装器。我的代码如下: 有人有什么想法吗? 我对使用ssh2函数的想法持开放态度,但我强烈希望使用文件系统和流函数。

  • 这是获取用户帐户及其Api密钥的endpoint:https://dev.openclinica.com/apidoc/#api-User_Account-getAccountByUserName使用带有postman的follingendpoint 后http://89.221.253.174:8080/OpenClinica/pages/accounts/login?username=pran

  • 我正在学习ssl通信的基础知识,尤其是AES加密。我读了OpenSSL代码,看到了一个名为< code>userkey的指针。 在文件"aes_core. c"中 > 从何而来?它是如何生成的? 我想知道不同版本AES的的实际大小。 256 位版本为 256 / 8 = 32,192 为 24,128 为 16?我有点迷茫。 如果长度是可变的,那么我应该如何为那些符合长度要求的输入创建一个安全的输

  • 我试图使用javascript创建ECDSA算法的密钥对,签名消息,然后在服务器端验证它(使用Java)。 示例javascript代码: 例如: 我做错了什么?