IntegrityError:唯一约束失败:auth_user.username - Django

时间:2021-06-25 02:40:34

标签: python-3.x django django-models

我有一个简单的登录和注册用户的示例应用程序。 我正在添加用于检查用户名是否已被使用的功能。 为此,在表单代码中,我像往常一样在 Django 中放置了一个验证函数。 它被称为clean_username。还有像 clean_emailclean 这样的函数来检查数据的完整性。 虽然其他两个可以很好地消除重复项,但 clean_username 函数特别错误。虽然我添加了一行来检查用户名是否已经存在,但它仍然抛出相同的完整性错误,这正是我想要避免的。 clean_username 函数在这里是我们所关心的。

注意:添加 print 语句仅用于调试目的。

请在下面找到代码 (forms.py):

from django import forms
from django.forms.widgets import Widget
from django.contrib.auth import get_user_model
from email_validator import validate_email, EmailNotValidError
from .constants import countries


User = get_user_model()

class RegisterForm(forms.Form):
    login = forms.CharField(label="Username:")
    password = forms.CharField(label="Password", widget=forms.PasswordInput())
    confirm_password = forms.CharField(label="Confirm Password:", widget=forms.PasswordInput())
    email = forms.EmailField(label="Email")

    
    def clean_username(self):
        print(f"Clean Username data: {self.cleaned_data}")
        username = self.cleaned_data.get("login")
        print("cleaning username...")
        existing_user_set = User.objects.filter(username=username)
        if existing_user_set.exists():
            raise forms.ValidationError("Username is taken!!")
        return username

    def clean(self):
        data = self.cleaned_data
        print(f"\n\nData from cleaned data: {data}")
        password = data.get('password')
        confirm_password = data.get('confirm_password')
        if password != confirm_password:
            raise forms.ValidationError("Passwords do not match.")
        return data

堆栈跟踪如下:

Internal Server Error: /register/
Traceback (most recent call last):
  File "C:\Users\LENOVO\Envs\dj_ecomm\lib\site-packages\django\db\backends\utils.py", line 64, in execute
    return self.cursor.execute(sql, params)
  File "C:\Users\LENOVO\Envs\dj_ecomm\lib\site-packages\django\db\backends\sqlite3\base.py", line 328, in execute
    return Database.Cursor.execute(self, query, params)
sqlite3.IntegrityError: UNIQUE constraint failed: auth_user.username

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "C:\Users\LENOVO\Envs\dj_ecomm\lib\site-packages\django\core\handlers\exception.py", line 41, in inner
    response = get_response(request)
  File "C:\Users\LENOVO\Envs\dj_ecomm\lib\site-packages\django\core\handlers\base.py", line 187, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "C:\Users\LENOVO\Envs\dj_ecomm\lib\site-packages\django\core\handlers\base.py", line 185, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "D:\Apurva_Data\Works\Udemy\django_ecommerce_app\ecommerce\views.py", line 61, in register_page
    new_user = User.objects.create_user(username, email, password)
  File "C:\Users\LENOVO\Envs\dj_ecomm\lib\site-packages\django\contrib\auth\models.py", line 159, in create_user
    return self._create_user(username, email, password, **extra_fields)
  File "C:\Users\LENOVO\Envs\dj_ecomm\lib\site-packages\django\contrib\auth\models.py", line 153, in _create_user
    user.save(using=self._db)
  File "C:\Users\LENOVO\Envs\dj_ecomm\lib\site-packages\django\contrib\auth\base_user.py", line 80, in save
    super(AbstractBaseUser, self).save(*args, **kwargs)
  File "C:\Users\LENOVO\Envs\dj_ecomm\lib\site-packages\django\db\models\base.py", line 807, in save
    self.save_base(using=using, force_insert=force_insert,
  File "C:\Users\LENOVO\Envs\dj_ecomm\lib\site-packages\django\db\models\base.py", line 838, in save_base
    updated = self._save_table(raw, cls, force_insert, force_update, using, update_fields)
  File "C:\Users\LENOVO\Envs\dj_ecomm\lib\site-packages\django\db\models\base.py", line 924, in _save_table
    result = self._do_insert(cls._base_manager, using, fields, update_pk, raw)
  File "C:\Users\LENOVO\Envs\dj_ecomm\lib\site-packages\django\db\models\base.py", line 962, in _do_insert
    return manager._insert([self], fields=fields, return_id=update_pk,
  File "C:\Users\LENOVO\Envs\dj_ecomm\lib\site-packages\django\db\models\manager.py", line 85, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
  File "C:\Users\LENOVO\Envs\dj_ecomm\lib\site-packages\django\db\models\query.py", line 1079, in _insert
    return query.get_compiler(using=using).execute_sql(return_id)
  File "C:\Users\LENOVO\Envs\dj_ecomm\lib\site-packages\django\db\models\sql\compiler.py", line 1112, in execute_sql
    cursor.execute(sql, params)
  File "C:\Users\LENOVO\Envs\dj_ecomm\lib\site-packages\django\db\backends\utils.py", line 79, in execute
    return super(CursorDebugWrapper, self).execute(sql, params)
  File "C:\Users\LENOVO\Envs\dj_ecomm\lib\site-packages\django\db\backends\utils.py", line 64, in execute
    return self.cursor.execute(sql, params)
  File "C:\Users\LENOVO\Envs\dj_ecomm\lib\site-packages\django\db\utils.py", line 94, in __exit__
    six.reraise(dj_exc_type, dj_exc_value, traceback)
  File "C:\Users\LENOVO\Envs\dj_ecomm\lib\site-packages\django\utils\six.py", line 685, in reraise
    raise value.with_traceback(tb)
  File "C:\Users\LENOVO\Envs\dj_ecomm\lib\site-packages\django\db\backends\utils.py", line 64, in execute
    return self.cursor.execute(sql, params)
  File "C:\Users\LENOVO\Envs\dj_ecomm\lib\site-packages\django\db\backends\sqlite3\base.py", line 328, in execute
    return Database.Cursor.execute(self, query, params)
django.db.utils.IntegrityError: UNIQUE constraint failed: auth_user.username

urls.py

from django.conf.urls import url
from django.contrib import admin

from .views import (
    home_page, about_page, contact_page, 
    management_team_page, enquiry_form_page,
    login_page, register_page
)

urlpatterns = [
    url(r'^$', home_page, name="home"),
    url(r'^about/$', about_page, name='about'),
    url(r'^contact/$', contact_page, name='contact'),
    url(r'^management/$', management_team_page, name='management_team'),
    url(r'^enquiry/$', enquiry_form_page, name='enquiry_form'),
    url(r'^login/$', login_page, name='login'),
    url(r'^register/$', register_page, name='registration'), <- this is the registration url leading to the error
    url(r'^admin/', admin.site.urls),
]

相关views.py

def register_page(request):
    register_form = RegisterForm(request.POST or None)
    context = {
        "form": register_form,
        "message": "Register",
        "title": "Register"
    }
    if register_form.is_valid():
        username = register_form.cleaned_data.get("login")
        email = register_form.cleaned_data.get("email")
        password = register_form.cleaned_data.get("password")
        new_user = User.objects.create_user(username, email, password)
        print(f"Newly created user: \n{ new_user }")

    return render(request, "auth/register.html", context)

0 个答案:

没有答案
相关问题