2016-05-25 18 views
1

私はカスタムユーザーモデルからなるログインを実装しようとしています。 allauth.account.forms.LoginFormから継承し、カスタムログインフォームにカスタムフィールドを追加することはできますか?Django allauthカスタムログインフォームはカスタムユーザーモデルのすべてのフィールドをレンダリングしません

login()メソッドをオーバーライドすることで、ログイン時にユーザーに役割を割り当てることをお勧めします。

私はallauth configurationに続き、私はdjango.contrib.auth.backends.ModelBackendallauth.account.auth_backends.AuthenticationBackend以外の認証バックエンドを使用していないしています何のフォームコード

AUTH_USER_MODEL = 'core.User' 
ACCOUNT_SIGNUP_FORM_CLASS = 'core.forms.SignupForm' 
ACCOUNT_FORMS = {'login': 'core.forms.CoreLoginForm'} 

を以下にsettings.pyにログインするために使用することが言及しています。カスタムのサインアップは何の問題もなく私のためにうまくいきます。しかし、カスタムloginformは、ユーザーモデルのすべてのフィールドをレンダリングしません。 Allauth LoginFormはこのSO Postに受け入れられた回答ごとに継承され、カスタムログインフォームにchoicefieldが追加されました。

from allauth.account.forms import LoginForm 
class CoreLoginForm(LoginForm): 
    def __init__(self, *args, **kwargs): 
     self.request = kwargs.pop('request', None) 
     super(CoreLoginForm, self).__init__(*args, **kwargs) 
    role = forms.ChoiceField(widget=forms.Select(), choices=User.roles, initial=User.roles[0]) 

./manage.py runserverには、Module "core.forms" does not define a "SignupForm" classと記載されています。私はすでにcore.formsのSignupFormを以下のように定義し、signup will work if CoreLoginForm is inherited from forms.Form instead of LoginFormと定義しています。そうすれば

class CoreLoginForm(forms.Form): 
    def __init__(self, *args, **kwargs): 
     self.request = kwargs.pop('request', None) 
     super(CoreLoginForm, self).__init__(*args, **kwargs) 

    role = forms.ChoiceField(widget=forms.Select(), choices=User.roles, initial=User.roles[0]) 

私はカスタムログインフォームをhtmlページにレンダリングできます。しかしここでの問題は、authenticate()perform_login()などを含むクラスのすべてのメソッドを再定義する必要があることです。これは、LoginForm全体をコピーし、アプリのforms.pyに貼り付けることになります。私はこれがDRY原則に反していると思うので、これをしたくない。カスタムのloginformにカスタムフィールドを追加してlogin()メソッドをオーバーライドする簡単な方法はありますか?

TIA

答えて

3

は、おそらくあなたはすでにあなたの問題を解決してきたが、私は私がする簡単な方法を発見した私のようなこの問題の10分、より多くを過ごした:)

まし他のみんなのために、このソリューションを残すでしょう

ACCOUNT_FORMS = {'login': 'core.forms.CoreLoginForm'} 

をし、あなたのforms.pyで、その後、あなたがする必要があります。settings.pyに追加 - あなたが行ってきたように

:ログインフォームをAllauthにフィールドを追加dd:

+0

これを行うにはいくつかの方法がありますが、私はこれが最もPython/Djangoの方法だと感じています。解決して投稿するに値する良い仕事/最高の投票。 –

関連する問題