在没有页面重新加载的simple-math-captcha django中获取新的验证码

时间:2015-12-17 13:00:08

标签: python ajax django

我使用django 1.8.5和simple-math-captcha。问题是如何通过ajax获取新的验证码。

comment_form.html:

 <div class="form-group">
            {{form.captcha}}
            <span class="error" id="comment-error-captcha"></span>
        </div>

forms.py:

class AddCommentForm(forms.ModelForm):
    captcha = MathCaptchaField(widget=MathCaptchaWidget(question_tmpl=u'<label for="id_captcha_0">What is the answer %(num1)i %(operator)s %(num2)i? </label>'))
    class Meta:
        model = Comment
        fields = '__all__'
    def __init__(self, *args, **kwargs):
        super(AddCommentForm, self).__init__(*args, **kwargs)
        self.fields['captcha'].widget.attrs['class'] = 'form-control'

我不知道如何在不重新加载页面的情况下获取新的验证码,请帮帮我。

2 个答案:

答案 0 :(得分:0)

显然你需要使用ajax重载,但simple-math-captcha不能提供这个解决方案。您可以覆盖此模块并添加ajax刷新或使用另一个。我在我的项目django-simple captcha中使用它已经带有ajax刷新。 例如:

HTML:

<form action='.' method='POST'>
    {{ form }}
    <input type="submit" />
    <button class='js-captcha-refresh'></button>
</form>

的javascript:

$('.js-captcha-refresh').click(function(){
    $form = $(this).parents('form');

    $.getJSON($(this).data('url'), {}, function(json) {
        // This should update your captcha image src and captcha hidden input
    });

    return false;
});

答案 1 :(得分:0)

解决方案:

class GetNewCaptcha(View):

def get(self, request, **kwargs):
    r = {}
    form = AddCommentForm()
    token = self.get_or_create_csrf_token(request)
    r['token'] = token
    r['captcha'] = str(form['captcha'])
    return JsonResponse(r)