首页 > 解决方案 > Django modal loginview - 错误:“表单”应包含有效的 Django 表单

问题描述

我正在尝试使用引导模式登录,以便可以使用登录弹出窗口通过我的导航栏从任何页面访问它。现在的问题是如何传递该表单以便所有页面都可以访问它?目前我收到此错误:

引导错误在 /

参数“form”应该包含一个有效的 Django 表单。

我现在没有为我的登录表单使用单独的页面,而是:

login3.html

{% load bootstrap3 %}
<div class="modal fade" id="login-modal" tabindex="-1" role="dialog" 
     aria-labelledby="myModalLabel" aria-hidden="true" style="display: none;">
        <div class="modal-dialog">
            <div class="modal-content">

                <div class="modal-header" align="center">
                    <button type="button" class="close" data-dismiss="modal" aria-label="Close">
                        <span class="glyphicon glyphicon-remove" aria-hidden="true"></span>
                    </button>
                </div>

        <div id="div-forms">
          <form id="login-form" action="{% url 'login3' %}" method="post" 
                enctype="multipart/form-data">
            {% csrf_token %}
            <div class="modal-body">
              {% bootstrap_form form %}
            </div>
            <div class="modal-footer">
              {% buttons %}
                <button type="submit" class="btn btn-primary">Login</button>
              {% endbuttons %}
            </div>
          </form>
        </div>
            </div>
        </div>
</div>

看法:

class Login3View(NextUrlMixin, RequestFormAttachMixin, FormView):
    form_class = LoginForm
    template_name = 'accounts/login3.html'
    success_url = '/'
    default_next = '/'

然后我只是将模板 login3.html 与我的导航栏一起包含在内,以便在每个页面上加载表单。

我在另一个问题上看到了来自 C14L 的答案(Django login from in modal window),看起来很有希望,但无法让它发挥作用。

感谢任何提示。


更新:这是登录表单

class LoginForm(forms.Form):
    email = forms.EmailField(label='Email')
    password = forms.CharField(widget=forms.PasswordInput)

    def __init__(self, request, *args, **kwargs):
        self.request = request
        super(LoginForm, self).__init__(*args, **kwargs)

    def clean(self):
        request = self.request
        data = self.cleaned_data
        email = data.get("email")
        password = data.get("password")

        qs=User.objects.filter(email=email)
        if qs.exists():
            #user email is registered, check active/email activation
            not_active = qs.filter(is_active=False)
            if not_active.exists():
                #not active, check email activation
                ....

标签: djangodjango-formsdjango-templatesdjango-views

解决方案


您已将request参数添加到您的LoginForm:

class LoginForm(forms.Form):

    # ...

    def __init__(self, request, *args, **kwargs):
        self.request = request
        super(LoginForm, self).__init__(*args, **kwargs)

您需要修补get_form_kwargs函数,以便在初始化表单时添加参数request

class Login3View(NextUrlMixin, RequestFormAttachMixin, FormView):
    form_class = LoginForm
    template_name = 'accounts/login3.html'
    success_url = '/'
    default_next = '/'

    def get_form_kwargs(self, *args, **kwargs):
        kwargs = super().get_form_kwargs(*args, **kwargs)
        kwargs['request'] = self.request
        return kwargs

推荐阅读