django allauth空用户名会导致postgress DB中的重复密钥

Dav*_*avy 1 django django-allauth

Django 1.8.16 django-allauth 0.27.0使用postgres作为数据库。

我的应用程序不使用用户名,仅使用电子邮件地址作为用户ID。所以我使用以下设置:

ACCOUNT_AUTHENTICATION_METHOD = 'email'
ACCOUNT_USERNAME_REQUIRED = False
ACCOUNT_EMAIL_REQUIRED = True
ACCOUNT_UNIQUE_EMAIL = True
ACCOUNT_EMAIL_VERIFICATION = "mandatory"
ACCOUNT_USER_MODEL_USERNAME_FIELD = None
ACCOUNT_USER_MODEL_EMAIL_FIELD = 'email'
Run Code Online (Sandbox Code Playgroud)

现在,当新用户注册时,他将使用他的电子邮件地址。但是在提交注册表时,出现了以下错误:

IntegrityError at /accounts/signup/
duplicate key value violates unique constraint "auth_user_username_key"
DETAIL:  Key (username)=() already exists.
Request Method: POST
Request URL:    http://swd.localhost:8000/accounts/signup/
Django Version: 1.8.16
Exception Type: IntegrityError
Exception Value:    
duplicate key value violates unique constraint "auth_user_username_key"
DETAIL:  Key (username)=() already exists.
Run Code Online (Sandbox Code Playgroud)

这恰恰说明了问题所在:auth_user表的“用户名”字段中已经存在空用户名,并且似乎不允许这样做?但是问题在于,使用上述设置,用户名字段始终为空。那么我们如何解决这个问题?

我没有适应用户模型。

pen*_*rsr 5

通过做这个...

ACCOUNT_USER_MODEL_USERNAME_FIELD = None

...您告诉allauth您的用户模型没有username字段。在您的情况下,这显然是错误的,因为您在该列上遇到了约束错误。因此,只需将其设置为"username"None以便allauth将正确填充该字段。

  • 所以实际上,如果我将其设置为“无”,我应该从用户模型中删除该字段吗?或者至少删除该字段上的“唯一”约束。事实是它默认存在,因此不使用用户名字段并不像将 ACCOUNT_USER_MODEL_USERNAME_FIELD 设置为 None 那样简单,如许多地方所述,包括这个相当官方的参考:http://django-allauth.readthedocs.io/en/latest /高级.html (2认同)