使用ACCOUNT_FORMS覆盖Django allauth登录表单

wna*_*jar 5 python forms django django-forms django-allauth

我已经使用简单的设置变量覆盖了注册表单,ACCOUNT_SIGNUP_FORM_CLASS但是要覆盖您需要使用的登录表单ACCOUNT_FORMS = {'login': 'yourapp.forms.LoginForm'}.我有我想要的形式,它与crispy-forms和Bootstrap3完美地显示:

class LoginForm(forms.Form):
    login = forms.EmailField(required = True)
    password = forms.CharField(widget = forms.PasswordInput, required = True)

    helper = FormHelper()
    helper.form_show_labels = False
    helper.layout = Layout(
        Field('login', placeholder = 'Email address'),
        Field('password', placeholder = 'Password'),
        FormActions(
            Submit('submit', 'Log me in to Cornell Forum', css_class = 'btn-primary')
        ),
    )
Run Code Online (Sandbox Code Playgroud)

当我提交表格时,我得到了AttributeError at /account/login/ - 'LoginForm' object has no attribute 'login'.这里出了什么问题?原始allauth登录表单的来源是:https://github.com/pennersr/django-allauth/blob/master/allauth/account/forms.py

and*_*.ge 7

根据我的理解,您可以使用覆盖默认的LoginForm ACCOUNT_FORMS,但是您需要提供一个包含原始类中提供的所有方法的类.你的班级缺少login方法.

我会ACCOUNT_FORMS = {'login': 'yourapp.forms.YourLoginForm'}在你的settings.py文件中设置,YourLoginForm继承自原始类.

# yourapp/forms.py

from allauth.account.forms import LoginForm

class YourLoginForm(LoginForm):
    def __init__(self, *args, **kwargs):
        super(YourLoginForm, self).__init__(*args, **kwargs)
        self.fields['password'].widget = forms.PasswordInput()

        # You don't want the `remember` field?
        if 'remember' in self.fields.keys():
            del self.fields['remember']

        helper = FormHelper()
        helper.form_show_labels = False
        helper.layout = Layout(
            Field('login', placeholder = 'Email address'),
            Field('password', placeholder = 'Password'),
            FormActions(
                Submit('submit', 'Log me in to Cornell Forum', css_class = 'btn-primary')
            ),
        )
        self.helper = helper
Run Code Online (Sandbox Code Playgroud)