Django allauth - 使用自定义表单验证错误不显示在模板上

Django allauth - using custom form Validation errors do not show on the template

我使用 django Allauth 进行用户注册和登录。 我有两种不同类型用户的注册表单。

Setting.py

ACCOUNT_SIGNUP_FORM_CLASS = 'myapp.forms.mySignupForm_1'

form.py

class mySignupForm_1(forms.Form):
    def signup(self, request, user):
        user.save()



class mySignupForm_2(forms.Form):
    email = forms.EmailField(max_length=255, label="Email")
    password1 = forms.CharField(widget=forms.PasswordInput(), label="Password")
    password2 = forms.CharField(widget=forms.PasswordInput(), label="Password (again)")
    last_name = forms.CharField(max_length=60, label='Last Name')
    first_name = forms.CharField(max_length=60, label='First Name')

    print('1111')   # it prints when the template is render.

    def signup(self, request, user):     
            print('22222') # this line never print. It seems the program never reach here

            # last_name and first_name are not saved in the Database. WHY?
            user.email = self.clean_data['email']
            user.last_name = self.clean_data['last_name']
            user.first_name = self.clean_data['first_name']
            user.save()

view.py

class JointLoginSignupView(LoginView):
    form_class = LoginForm
    signup_form  = SignupForm
    def __init__(self, **kwargs):
        super(JointLoginSignupView, self).__init__(*kwargs)        

    def get_context_data(self, **kwargs):
        ret = super(JointLoginSignupView, self).get_context_data(**kwargs)
        ret['mysignupform1'] = get_form_class(app_settings.FORMS, 'signup', self.signup_form)
        return ret

login = JointLoginSignupView.as_view()




class CustomSignupView2(SignupView):

    template_name = "account/merchant_signup.html"
    custom_signup_form2 = MerchantSignupForm

    def __init__(self, **kwargs):
        super(CustomSignupView2, self).__init__(*kwargs)       

    def get_context_data(self, **kwargs):
        ret = super(CustomSignupView2, self).get_context_data(**kwargs)
        ret['custom_signup_form2'] = get_form_class(app_settings.FORMS, 'signup', self.custom_signup_form2)
        return ret

custom_signup_form2= CustomSignupView2.as_view()

url.py

 url(r'^signup1/', 'allauth.views.signup', name='signup1'),
 url(r'^signup2/', 'allauth.views.custom_signup_form2', name='signup2'),

显示错误的模板 1

<form class="signup_form" name="registerForm" action="{% url 'signup1' %}" method="post"> 
                        {% csrf_token %} 



                        {{mysignupform1| crispy }}

                        {% if redirect_field_value %}
                            <input type="hidden" name="{{ redirect_field_name }}" value="{{ redirect_field_value }}" />
                        {% endif %}


                        <div>
                            <button type="submit" class="btn btn-group btn-primary">{%trans 'Create an Account' %}</button>
                        </div>

                    </form>

不显示错误的模板 2

<form class="signup_form" name="registerForm" action="{% url 'signup2' %}" method="post"> 
                    {% csrf_token %} 



                    {{custom_signup_form2| crispy }}

                    {% if redirect_field_value %}
                        <input type="hidden" name="{{ redirect_field_name }}" value="{{ redirect_field_value }}" />
                    {% endif %}


                    <div>
                        <button type="submit" class="btn btn-group btn-primary">{%trans 'Create an Account' %}</button>
                    </div>

                </form>

如果我在自定义中输入了错误的数据signup_form1,它会显示如下错误

我有两个问题:

  1. 如果我在第二个自定义注册表单中做同样的事情,它不会显示这些错误。如何使第二个表单显示验证错误?

  2. 在form.py中,print('222')行在函数mySignupForm_2 似乎永远达不到。并且不会保存额外的字段姓氏和名字。我是不是做错了什么?

ACCOUNT_SIGNUP_FORM_CLASS = 'myapp.forms.mySignupForm_1'

您在设置文件中将 ACCOUNT_SIGNUP_FORM_CLASS 设置为 customform1。将其设置为 customform2,看看会发生什么。在这种情况下应该调用打印语句。

但是,据我所知,在django_allauth中无法设置多个注册表单。