2017-02-10 1 views
1

장고 1.8.16 django-allauth 0.27.0 postgres를 데이터베이스로 사용합니다.django allauth 비어있는 사용자 이름은 후행 DB에서 중복 키를 발생시킵니다.

내 응용 프로그램에서는 사용자 이름을 전자 메일 주소로 사용하지 않고 사용자 이름 만 사용합니다. 그래서 나는 다음과 같은 설정을 사용

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' 

새로운 사용자 등록, 그는 자신의 전자 메일 주소를 사용하여 지금. 그러나 등록 양식을 제출할 때,이 오류가 발생합니다 :

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. 

이 말하는 정확히 무엇을 잘못 : 빈 사용자 이름이 이미 AUTH_USER 테이블, 필드 "사용자 이름"에 존재하고, 이것이 허용되지 않는 것 같습니다? 하지만 위의 설정을 사용하면 사용자 이름 필드가 항상 비어 있습니다. 어떻게이 문제를 해결할 수 있습니까?

나는 사용자 모델을 채택하지 않았습니다. 이메일 주소로 user.username 필드를 채우고 allauth 계정 어댑터를 작성하여 해결

+0

DB에서 'username'필드는 '고유'로 표시됩니다. 따라서 이것이 실제로 모든 사용자에 대해 Null이 될 수 없다는 것을 의미합니다. DB 수준에서 '고유'제약 조건을 제거 할 수 있지만이를 수행하는 더 깨끗한 방법이 있어야합니까? – Davy

+0

DB 수준에서이를 제거하는 것이 간단하지 않은 것처럼 보이며 올바른 방법이 아닙니다. 그럼 어떻게이 문제를 해결할 수 있을까요? Thx 당신의 도움. – Davy

답변

1

:

from allauth.account.adapter import DefaultAccountAdapter 

class AccountAdapter(DefaultAccountAdapter): 
    def save_user(self, request, user, form, commit=False): 
     data = form.cleaned_data 
     user.username = data['email'] # username not in use 
     user.email = data['email'] 
     if 'password1' in data: 
      user.set_password(data['password1']) 
     else: 
      user.set_unusable_password() 

     user.save() 
     return user 

는 설정을 변경하지 않았다.

ACCOUNT_USER_MODEL_USERNAME_FIELD = None

이 ... 당신이 당신의 사용자 모델이 더 username 필드가 없음을 allauth 말하고있다 ... 이렇게 How could one disable new account creation with django-allauth, but still allow existing users to sign in?

+0

다른 대답에 따라 설정을 변경하려는 경우에도 궁금한 점이 있습니까? 결국, @pennersr는 django-allauth의 주 저자이기 때문에 그의 제안이 아마도 의미가 있었을 것입니다 ... – ZG101

+0

위와 같이 : 사용자 이름이 DB에서 고유 한 것으로 표시되었으므로 ACCOUNT_USER_MODEL_USERNAME_FIELD를 None으로 변경해도 문제가 해결되지 않았습니다 (" 중복 키 "). 어쩌면 다른 설정도 영향을 미칩니 까? – Davy

+0

나는 본다. 이 설정은 사용자 정의 사용자 모델 (예 : 사용자 이름 'personname'을 대신 호출하는 경우)에서만 변경됩니다. 따라서 실제 문제는 기본 사용자 모델에 빈 사용자 이름을 사용할 수 없다는 것입니다. 그렇지 않으면 모든 사용자 이름이 ''(공백) 일 때 중복이 발생합니다. 사용자 이름이 공백으로 표시되지 않기 때문에 솔루션이 작동합니다. 그러나 이메일이 고유한지 확인하지 않는 한 누군가가 동일한 이메일을 두 번 사용하면 사용자 이름이 중복되어 실패합니다. – ZG101

2

:

에 의해 영감을. 귀하의 경우, 그것은 분명히 잘못되었습니다, 당신은 그 열에 제약 오류가 발생합니다. 따라서 None 대신 "username"으로 설정하면 allauth가 필드를 올바르게 채울 수 있습니다.

+0

사실 "None"으로 설정하면 사용자 모델에서 해당 필드를 제거해야합니까? 또는 적어도 해당 필드에 대한 "고유"제한 조건을 제거하십시오.사실 그것은 기본적으로 존재하기 때문에 username 필드를 사용하지 않는 것이 공식적인 참조 인 http://django-allauth.readthedocs.io/en/latest를 비롯한 많은 곳에서 설명한 것처럼 ACCOUNT_USER_MODEL_USERNAME_FIELD를 None으로 설정하는 것만 큼 간단하지 않습니다. /advanced.html – Davy