Модальное имя входа в Django - ошибка: «форма» должна содержать действительную форму Django - PullRequest
0 голосов
/ 04 сентября 2018

Я пытаюсь выполнить вход в систему с помощью модема начальной загрузки, чтобы к нему можно было получить доступ с любой страницы через панель навигации с помощью всплывающего окна входа в систему. Теперь проблема в том, как передать эту форму, чтобы все страницы могли получить к ней доступ? На данный момент я получаю эту ошибку:

BootstrapError at /

Параметр «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 из модального окна ), который выглядел многообещающе, но не смог заставить его работать.

Спасибо за любые советы.


Обновление: вот форма 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 голосов
/ 05 сентября 2018

Вы добавили параметр request в LoginForm:

class LoginForm(forms.Form):

    # ...

    def __init__(self, <b>request</b>, *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)
        <b>kwargs['request'] = self.request</b>
        return kwargs
...