2017-02-10 14 views
1

Django 1.8.16 django-allauth 0.27.0 データベースとしてpostgresを使用しています。django allauth空のユーザー名がポストのDBに重複キーを生成する

私のアプリケーションではユーザー名は使用せず、電子メールアドレスのみをユーザー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' 

新しいユーザ登録は、彼が彼の電子メールアドレスを使用しています今すぐ。 しかし、登録フォームを送信するとき、私はこのエラーを取得:空のユーザー名は、すでに、AUTH_USERテーブルのフィールド「ユーザー名」が存在し、それが、これは許可されていないようだ。

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. 

これは間違っている正確に何と言いますか? しかし、問題は上記の設定を使用してusernameフィールドが常に空であることです。 どうすればこの問題を回避できますか?

私はユーザーモデルに適合しませんでした。メールアドレスと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 

は、設定を変更しませんでした。触発され

:これを行うことにより 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」を呼び出した場合)に対してのみ変更されます。したがって、実際の問題は、既定のユーザーモデルに空白のユーザー名を使用できないことです(そうしないと、すべてのユーザー名が ''(空白)のときに重複が発生します)。ユーザー名が空白にならないようにするため、ソリューションは機能します。ただし、メールが一意であることを確認しない限り、ユーザー名が重複するため、同じメールを2回使用すると失敗します。 – ZG101

2

...

ACCOUNT_USER_MODEL_USERNAME_FIELD = None

...あなたは、あなたのユーザモデルが全くusernameフィールドを持っていないことをallauth語っています。あなたのケースでは、それは明らかに間違っています、あなたはその列に制約エラーを取得します。したがって、Noneの代わりに"username"に設定すると、allauthが正しくフィールドに入力されます。

+0

実際、「None」に設定した場合、そのフィールドをユーザーモデルから削除する必要がありますか?または、少なくともそのフィールドの "一意の"制約を削除します。実際にはデフォルトでそこに存在するので、ユーザー名フィールドを使用しないのは、この正式な参照を含む多くの場所で説明されているように、ACCOUNT_USER_MODEL_USERNAME_FIELDをNoneに設定するだけでは簡単ではありません。http://django-allauth.readthedocs.io/en/latest /advanced.html – Davy

関連する問題