![](/img/trans.png)
[英]how to validate django-recaptcha with ajax form in django
[英]django-recaptcha doesn't validate the input
我正在尝试将django-recaptcha与django-registration集成。 我已经确保django注册有效。 然后,根据其文档( django-recaptcha 0.0.6 )安装并配置django-recaptcha。
我在registration/forms.py
RegistrationForm
类中添加captcha = ReCaptchaField()
,如下所示:
from captcha.fields import ReCaptchaField
class RegistrationForm(forms.Form):
required_css_class = 'required'
username = forms.RegexField(regex=r'^[\w.@+-]+$', max_length=30, label=_("Username"), error_messages={'invalid': _("This value may contain only letters, numbers and @/./+/-/_ characters.")})
email = forms.EmailField(label=_("E-mail"))
password1 = forms.CharField(widget=forms.PasswordInput, label=_("Password"))
password2 = forms.CharField(widget=forms.PasswordInput, label=_("Password (again)"))
captcha = ReCaptchaField()
...
验证码会显示,但是无论我在chptcha文本中键入什么(键入无,正确或不正确的内容),在按“底部”后,它始终显示“此字段为必填”。 (当然我已经输入了两个密码字段)。
它不应该是私钥/公钥问题,因为设置不正确的验证码将不会显示,但会显示错误文本。 任何想法?
顺便说一句,我使用python 2.7和Django 1.4.3。 我已经测试了两种浏览器:chrome和IE9。
[更新]
我发现此问题的根本原因是因为我键入的文本没有传递给POST请求,如下所示:
POST:<QueryDict: {u'username': [u'test123'], u'password1': [u'123'], u'csrfmiddlewaretoken': [u'BUvEURhlUMYDx1DjztgdRuK1CrI7WanY'], u'email': [u'test@gmail.com'], u'password2': [u'123']}>,
客户端浏览器上显示的html源代码如下所示。 通常,它在POST请求中应该有“ recaptcha_challenge_field ”,但是我不确定为什么客户端浏览器不会在POST请求中发送此变量。 我是Java脚本的新手。 任何想法?
<!doctype html>
<html>
<head>
<title>Register for an account</title>
</head>
<body>
<table>
<form method='post' action=''><div style='display:none'><input type='hidden' name='csrfmiddlewaretoken' value='BUvEURhlUMYDx1DjztgdRuK1CrI7WanY' /></div>
<tr class="required"><th><label for="id_username">Username:</label></th><td><input id="id_username" type="text" name="username" maxlength="30" /></td></tr>
<tr class="required"><th><label for="id_email">E-mail:</label></th><td><input type="text" name="email" id="id_email" /></td></tr>
<tr class="required"><th><label for="id_password1">Password:</label></th><td><input type="password" name="password1" id="id_password1" /></td></tr>
<tr class="required"><th><label for="id_password2">Password (again):</label></th><td><input type="password" name="password2" id="id_password2" /></td></tr>
<tr class="required"><th><label for="id_captcha">Captcha:</label></th><td><script type="text/javascript">
var DjangoRecaptchaOptions = {
"lang": "en"
};
if (typeof RecaptchaOptions !== 'object') {
RecaptchaOptions = DjangoRecaptchaOptions;
} else {
for (key in DjangoRecaptchaOptions) {
RecaptchaOptions[key] = DjangoRecaptchaOptions[key];
}
}
</script>
<script type="text/javascript" src="https://www.google.com/recaptcha/api/challenge?k=6LeuNO4SAAAAAAdkaCUi6ybtISPI-YhIlOadgFNF&hl=en"></script>
<noscript>
<iframe src="https://www.google.com/recaptcha/api/noscript?k=6LeuNO4SAAAAAAdkaCUi6ybtISPI-YhIlOadgFNF&hl=en" height="300" width="500" frameborder="0"></iframe><br />
<textarea name="recaptcha_challenge_field" rows="3" cols="40"></textarea>
<input type='hidden' name='recaptcha_response_field' value='manual_challenge' />
</noscript>
</td></tr>
<tr><td></td><td><input type="submit" value="Send activation email" /></td>
</form>
</table>
</body>
</html>
我找到了答案! 这是因为registration_form.html中的<table>
标记,这是django-registration软件包提供的标记。 内容是:
{% extends "registration/registration_base.html" %}
{% load i18n %}
{% block title %}{% trans "Register for an account" %}{% endblock %}
{% block content %}
<table>
<form method='post' action=''>{% csrf_token %}
{{ form }}
<tr><td></td><td><input type="submit" value="{% trans "Send activation email" %}" /></td>
</form>
</table>
{% endblock %}
不幸的是,验证码还有另一个<table>
标签嵌入其Java脚本,这意味着将具有的ReCaptcha <table>
内部registration_form标签<table>
标记。 尽管浏览器可以正确呈现页面,但是,它无法正确检索嵌入式<table>
的字段,例如“ recaptcha_challenge_field”和“ recaptcha_response_field”
解决方案是从registration_form.html中删除<table>
相关标签。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.