Django模式登录视图-错误:“表单”应包含有效的Django表单

时间:2018-09-04 09:45:21

标签: django django-forms django-templates django-views

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

  

/

处的BootstrapError      

参数“表单”应包含有效的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)的一个答案,该答案看起来很有希望,但无法使它起作用。

感谢小费。


更新: 这是LoginForm

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
                ....

1 个答案:

答案 0 :(得分:1)

您已将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