私はカスタムユーザーモデルからなるログインを実装しようとしています。 allauth.account.forms.LoginForm
から継承し、カスタムログインフォームにカスタムフィールドを追加することはできますか?Django allauthカスタムログインフォームはカスタムユーザーモデルのすべてのフィールドをレンダリングしません
login()メソッドをオーバーライドすることで、ログイン時にユーザーに役割を割り当てることをお勧めします。
私はallauth configurationに続き、私はdjango.contrib.auth.backends.ModelBackend
とallauth.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
これを行うにはいくつかの方法がありますが、私はこれが最もPython/Djangoの方法だと感じています。解決して投稿するに値する良い仕事/最高の投票。 –