Пользовательская форма входа в Django с полем проверки кода, запрос NULL - PullRequest
0 голосов
/ 26 июня 2011

Я хочу добавить поле подтверждения кода в форму входа. Итак, я пишу поле authentication_form, которое добавило charField, чтобы сгенерировать проверочный код и проверочный код, сохраненный в request.session. Но когда я отправляю запрос формы входа в систему, я нахожу в своей форме authentication_form, я не могу сравнить код подтверждения сеанса и clean_data["verifycode"], Потому что запрос в Null при вызове моего authentic_form.

class MyAuthenticationForm(AuthenticationForm):
    verifyimg = forms.CharField(label="verifycode", widget=vericonf.CaptchaWidget)


    def __init__(self, request=None, *args, **kwargs):
        self.request = request
        kwargs_new = {'error_class': DivErrorList}
        kwargs.update(kwargs_new)
        #elf.error_class = DivErrorList
        super(MyAuthenticationForm, self).__init__(*args, **kwargs)


    def as_div(self):
        "Returns this form rendered as HTML div."
        return self._html_output(
            normal_row=u'<div%(html_class_attr)s style="float:left;"><div class="formlabel">%(label)s</div><div class="formfield">%(field)s%(help_text)s</div><div class="formerror">%(errors)s</div></div>',
            error_row=u'<div>%s</div>',
            row_ender=u'</div></div>',
            help_text_html=u'<div style="float:left;"><span class="helptext">%s</span></div>',
            errors_on_separate_row=False)

    def clean_verifyimg(self):
        pass

    def clean(self):
        vericode = ""
        username = self.cleaned_data.get('username')
        password = self.cleaned_data.get('password')

        if self.request and self.request.session and self.request.session.get("verifyimg"):
            vericode = self.request.session.get("verifyimg")

        print vericode  ###HERE request.session is Null then I can't compare vericode and verify now.How to do it?

        verify = self.cleaned_data.get('verifyimg')
        print verify

        if username and password:
            self.user_cache = authenticate(username=username, password=password)
            if self.user_cache is None:
                raise forms.ValidationError(
                    _("Please enter a correct username and password. Note that both fields are case-sensitive."))
            elif not self.user_cache.is_active:
                raise forms.ValidationError(_("This account is inactive."))
        if verify and vericode:
            if verify != vericode:
                raise forms.ValidationError("verify code is wrong.pls Try again!")

        self.check_for_test_cookie()

        return self.cleaned_data

1 Ответ

1 голос
/ 30 августа 2011

Проблема здесь в том, что Представление входа в Django не передает 'request' в 'authentication_form' , когда 'request.method' равен 'POST', а 'AuthenticationForm' ожидает аргумент ключевого слова 'request'.

Я решил проблему следующим образом:

Поместите мой код в оболочку вида "django.contrib.auth.login".

Вы все еще можете использовать свой "MyAuthenticationForm ', устанавливающий ваш urls.py следующим образом

url(r'^accounts/login/$',
        'myapp.views.custom_login',
        {'template_name': 'registration/login.html',
         'authentication_form': MyAuthenticationForm
        },
        name='auth_login'),

и помещающий это в ваши views.py

def custom_login(request, *args, **kwargs):
    if request.method == 'POST':
        form = MyAuthenticationForm(data=request.POST, request=request)
        # Here you take care of your form validation and interaction with request

    return login(request, *args, **kwargs)

Обратите внимание, что аргументы' data 'и' request 'должны быть аргументами ключевого слова.

...