使用ACCOUNT_FORMS覆盖Django allauth登录表单

5

我已经使用简单的设置变量 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')
        ),
    )

当我提交表单时,我遇到了一个错误:AttributeError at /account/login/ - 'LoginForm' object has no attribute 'login'。这是怎么回事?原始的allauth登录表单源代码在此处:https://github.com/pennersr/django-allauth/blob/master/allauth/account/forms.py

allauth的文档在这里,展示了设置:http://django-allauth.readthedocs.org/en/latest/configuration.html - wnajar
1个回答

8

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

我建议在settings.py文件中设置ACCOUNT_FORMS = {'login': 'yourapp.forms.YourLoginForm'},其中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

这基本上就是我所做的,但这是一场噩梦/不值得追求的道路,因为你必须复制整个复杂的“LoginForm”类。它不太可扩展且没有文档记录。最终,我放弃了Django并使用Laravel完成了应用程序...这是我做出的最好决定。 - wnajar
提醒任何阅读此内容的人,这个解决方案对我来说很好用,而且不需要复制其他任何东西。完美地运行了。 - awwester
我一直在做这个时遇到循环导入的问题。 - gdvalderrama
@guival 我也遇到了这个问题,因为SignupForm和forms.py中的LoginForm在同一个文件中,导致循环引用。我找到了另一种解决方案,就是将SignupForm单独放在一个文件中,与loginform分开,然后相应地更新你的ACCOUNT_SIGNUP_FORM_CLASS。这样就解决了:https://stackoverflow.com/questions/35945784/keeping-custom-sign-up-class-and-importing-allauth-forms-in-same-forms-py-file-c - Rob

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接