Python Django allauth自定义登录表单未呈现自定义用户模型中的所有字段

Python Django allauth自定义登录表单未呈现自定义用户模型中的所有字段,python,django,forms,django-allauth,Python,Django,Forms,Django Allauth,我正在尝试实现由自定义用户模型组成的登录。是否可以从allauth.account.forms.LoginForm继承并向自定义登录表单添加自定义字段 其思想是在登录时通过覆盖为用户分配一个角色 login()方法 我遵循并提到了使用以下代码在settings.py中登录时使用的表单 AUTH_USER_MODEL = 'core.User' ACCOUNT_SIGNUP_FORM_CLASS = 'core.forms.SignupForm' ACCOUNT_FORMS = {'login':

我正在尝试实现由自定义用户模型组成的登录。是否可以从
allauth.account.forms.LoginForm继承并向自定义登录表单添加自定义字段

其思想是在登录时通过覆盖为用户分配一个角色 login()方法

我遵循并提到了使用以下代码在settings.py中登录时使用的表单

AUTH_USER_MODEL = 'core.User'
ACCOUNT_SIGNUP_FORM_CLASS = 'core.forms.SignupForm'
ACCOUNT_FORMS = {'login': 'core.forms.CoreLoginForm'}
除了
django.contrib.auth.backends.modelbend
allauth.account.auth\u backends.AuthenticationBackend
之外,我没有使用任何身份验证后端。自定义注册对我来说没有任何问题。但是,自定义loginform不会呈现用户模型中的所有字段。Allauth LoginForm根据本文中接受的答案继承,并将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运行服务器上,它说
模块“core.forms”没有定义“SignupForm”类
。我已经在core.forms中定义了一个注册表单,如下所示,如果CoreLoginForm继承自forms.Form而不是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\u login()
等。这将导致复制整个LoginForm并将其粘贴到应用程序的forms.py中。我不想这样做,因为我认为这是违反干燥原则的。有没有一种简单的方法可以将自定义字段添加到自定义loginform并重写login()方法


TIA

也许你已经解决了你的问题,但我将把这个解决方案留给像我这样在这个问题上花了超过10分钟的其他人:)

我找到了一种向Allauth登录表单添加字段的简单方法:

完成后-添加到settings.py:

ACCOUNT_FORMS = {'login': 'core.forms.CoreLoginForm'}
然后在您的forms.py中添加:

from django import forms
from allauth.account.forms import LoginForm

class CoreLoginForm(LoginForm):

    def __init__(self, *args, **kwargs):
        super(CoreLoginForm, self).__init__(*args, **kwargs)
        ## here i add the new fields that i need
        self.fields["new-field"] = forms.CharField(label='Some label', max_length=100)

也许你已经解决了你的问题,但我将把这个解决方案留给像我这样在这个问题上花了超过10分钟的其他人:)

我找到了一种向Allauth登录表单添加字段的简单方法:

完成后-添加到settings.py:

ACCOUNT_FORMS = {'login': 'core.forms.CoreLoginForm'}
然后在您的forms.py中添加:

from django import forms
from allauth.account.forms import LoginForm

class CoreLoginForm(LoginForm):

    def __init__(self, *args, **kwargs):
        super(CoreLoginForm, self).__init__(*args, **kwargs)
        ## here i add the new fields that i need
        self.fields["new-field"] = forms.CharField(label='Some label', max_length=100)

有几种方法可以做到这一点,但我觉得这是Python/Django最常用的方法。很好的解决和发布工作值得投票。有几种方法可以做到这一点,但我觉得这是Python/Django最常用的方法。良好的工作/投票结果值得解决和发布。