问题描述
我是Django的初学者,这是我的第一个没有书籍或教程的项目。我从一个基于AbstractUser的Custom User类开始了我的项目。之后,我使用了第三方软件包django-allauth来处理用户注册流程,并且一切正常。用户只能注册并使用其电子邮件登录,不需要用户名。
当我在django-allauth配置中更改注册表单时,问题开始了。在此新表单中,我在用户注册时添加了一些自定义字段,但这给了我无法修复的错误。 重要的一件事是,即使我不断遇到此错误,也已创建了新用户。
使用新字段进行编辑
这是我的 models.py :
class CustomUser(AbstractUser):
username = models.CharField(max_length=100,unique=True,null=True)
email = models.EmailField(verbose_name="Email",null=True,max_length=250)
first_name = models.CharField(verbose_name="Nome",max_length=100,null=True)
last_name = models.CharField(verbose_name="Sobrenome",max_length=250,null=True)
USERNAME_FIELD = 'email'
required_FIELDS = ['first_name','last_name',]
我的 forms.py :
class CustomUserCreationForm(UserCreationForm):
class Meta:
model = get_user_model()
fields = ('email','first_name','major','university',)
class CustomUserChangeForm(UserChangeForm):
class Meta:
model = get_user_model()
fields = ('first_name',)
还有我的 admin.py :
class CustomUserAdmin(UserAdmin):
add_form = CustomUserCreationForm
form = CustomUserChangeForm
model = CustomUser
list_display = ['full_name','email',]
#fieldsets add fields to the change form and add_fieldsets to the creation form
fieldsets = UserAdmin.fieldsets + (
(None,{'fields': ('major',)}),)
add_fieldsets = (
(None,{
'classes': ('wide',),'fields': ('email','username','university'),}),)
ordering = ('email',)
admin.site.register(CustomUser,CustomUserAdmin)
编辑
由于我使用的是django-allauth,因此我认为这段代码可能会有所帮助。 settings.py :
#Django allauth settings
ACCOUNT_EMAIL_required = True #Email is required when signing up
ACCOUNT_AUTHENTICATION_METHOD = "email" #Users can only log in using their
ACCOUNT_USERNAME_required = False
ACCOUNT_USER_MODEL_USERNAME_FIELD = None
ACCOUNT_logoUT_REDIRECT = 'home'
LOGIN_REDIRECT_URL = 'home'
ACCOUNT_SIGNUP_FORM_CLASS = 'users.forms.CustomUserCreationForm'
EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'
Internal Server Error: /accounts/signup/
Traceback (most recent call last):
File "C:\Users\Bruno\.virtualenvs\Sophia-owJCV_9p\lib\site-packages\django\db\backends\utils.py",line 86,in _execute
return self.cursor.execute(sql,params)
File "C:\Users\Bruno\.virtualenvs\Sophia-owJCV_9p\lib\site-packages\django\db\backends\sqlite3\base.py",line 396,in execute
return Database.Cursor.execute(self,query,params)
sqlite3.IntegrityError: UNIQUE constraint Failed: users_customuser.email
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "C:\Users\Bruno\.virtualenvs\Sophia-owJCV_9p\lib\site-packages\django\core\handlers\exception.py",line 34,in inner
response = get_response(request)
File "C:\Users\Bruno\.virtualenvs\Sophia-owJCV_9p\lib\site-packages\django\core\handlers\base.py",line 115,in _get_response
response = self.process_exception_by_middleware(e,request)
File "C:\Users\Bruno\.virtualenvs\Sophia-owJCV_9p\lib\site-packages\django\core\handlers\base.py",line 113,in _get_response
response = wrapped_callback(request,*callback_args,**callback_kwargs)
File "C:\Users\Bruno\.virtualenvs\Sophia-owJCV_9p\lib\site-packages\django\views\generic\base.py",line 71,in view
return self.dispatch(request,*args,**kwargs)
File "C:\Users\Bruno\.virtualenvs\Sophia-owJCV_9p\lib\site-packages\django\utils\decorators.py",line 43,in _wrapper
return bound_method(*args,**kwargs)
File "C:\Users\Bruno\.virtualenvs\Sophia-owJCV_9p\lib\site-packages\django\views\decorators\debug.py",line 76,in sensitive_post_parameters_wrapper
return view(request,**kwargs)
File "C:\Users\Bruno\.virtualenvs\Sophia-owJCV_9p\lib\site-packages\allauth\account\views.py",line 215,in dispatch
return super(SignupView,self).dispatch(request,line 78,in dispatch
response = super(RedirectAuthenticatedUserMixin,File "C:\Users\Bruno\.virtualenvs\Sophia-owJCV_9p\lib\site-packages\allauth\account\views.py",line 191,in dispatch
return super(CloseableSignupMixin,File "C:\Users\Bruno\.virtualenvs\Sophia-owJCV_9p\lib\site-packages\django\views\generic\base.py",line 97,in dispatch
return handler(request,line 104,in post
response = self.form_valid(form)
File "C:\Users\Bruno\.virtualenvs\Sophia-owJCV_9p\lib\site-packages\allauth\account\views.py",line 231,in form_valid
self.user = form.save(self.request)
File "C:\Users\Bruno\.virtualenvs\Sophia-owJCV_9p\lib\site-packages\allauth\account\forms.py",line 405,in save
self.custom_signup(request,user)
File "C:\Users\Bruno\.virtualenvs\Sophia-owJCV_9p\lib\site-packages\allauth\account\forms.py",line 359,in custom_signup
custom_form.save(user)
File "C:\Users\Bruno\.virtualenvs\Sophia-owJCV_9p\lib\site-packages\django\contrib\auth\forms.py",line 128,in save
user.save()
File "C:\Users\Bruno\.virtualenvs\Sophia-owJCV_9p\lib\site-packages\django\contrib\auth\base_user.py",line 66,in save
super().save(*args,**kwargs)
File "C:\Users\Bruno\.virtualenvs\Sophia-owJCV_9p\lib\site-packages\django\db\models\base.py",line 745,in save
self.save_base(using=using,force_insert=force_insert,File "C:\Users\Bruno\.virtualenvs\Sophia-owJCV_9p\lib\site-packages\django\db\models\base.py",line 782,in save_base
updated = self._save_table(
File "C:\Users\Bruno\.virtualenvs\Sophia-owJCV_9p\lib\site-packages\django\db\models\base.py",line 886,in _save_table
results = self._do_insert(cls._base_manager,using,fields,returning_fields,raw)
File "C:\Users\Bruno\.virtualenvs\Sophia-owJCV_9p\lib\site-packages\django\db\models\base.py",line 923,in _do_insert
return manager._insert(
File "C:\Users\Bruno\.virtualenvs\Sophia-owJCV_9p\lib\site-packages\django\db\models\manager.py",line 82,in manager_method
return getattr(self.get_queryset(),name)(*args,**kwargs)
File "C:\Users\Bruno\.virtualenvs\Sophia-owJCV_9p\lib\site-packages\django\db\models\query.py",line 1204,in _insert
return query.get_compiler(using=using).execute_sql(returning_fields)
File "C:\Users\Bruno\.virtualenvs\Sophia-owJCV_9p\lib\site-packages\django\db\models\sql\compiler.py",line 1377,in execute_sql
cursor.execute(sql,params)
File "C:\Users\Bruno\.virtualenvs\Sophia-owJCV_9p\lib\site-packages\django\db\backends\utils.py",line 100,in execute
return super().execute(sql,line 68,in execute
return self._execute_with_wrappers(sql,params,many=False,executor=self._execute)
File "C:\Users\Bruno\.virtualenvs\Sophia-owJCV_9p\lib\site-packages\django\db\backends\utils.py",line 77,in _execute_with_wrappers
return executor(sql,many,context)
File "C:\Users\Bruno\.virtualenvs\Sophia-owJCV_9p\lib\site-packages\django\db\backends\utils.py",params)
File "C:\Users\Bruno\.virtualenvs\Sophia-owJCV_9p\lib\site-packages\django\db\utils.py",line 90,in __exit__
raise dj_exc_value.with_traceback(traceback) from exc_value
File "C:\Users\Bruno\.virtualenvs\Sophia-owJCV_9p\lib\site-packages\django\db\backends\utils.py",params)
django.db.utils.IntegrityError: UNIQUE constraint Failed: users_customuser.email
[21/Aug/2020 11:08:00] "POST /accounts/signup/ HTTP/1.1" 500 214904
Database before creating first user
Database after creating first user
解决方法
这样写:
email = models.EmailField(verbose_name="Email",null=True,unique=True,max_length=100)
,
好吧,经过一些研究,我设法解决了我的问题
问题出在我的CustomUserCreationForm中。由于我使用django-allauth进行身份验证,因此我应该在创建表单中添加其他字段,然后让django-allauth处理电子邮件和密码字段。 因此,通过从Meta类中删除电子邮件,我可以解决用户电子邮件中发生的IntegrityError。
现在,我的CustomUserCreationForm看起来像这样:
model = CustomUser
fields = ('first_name','last_name','date_of_birth',)```