我有一个包含2个字段的表单,手机号码和短信验证码。这个想法是,一旦你输入你通过AJAX提交表单,如果成功它进入其他地方,如果不是它返回错误消息。我没有直接使用默认表单提交的原因是因为我希望页面保持不变以防出现错误。
另外,不确定这是否是相关信息,但我通过ajax将相同的表单提交到2个不同的URL,一个用于SMS发送,一个用于提交整个表单。
好了这里的代码,我拿出了所有格式化的HTML,只是为了缩短它。
模板 - 表单。 {{ form.phone }}
是电话号码输入,{{ form.verification }}
是短信验证。此外,{% url 'login_view' %}
是我在下面发布的视图的网址。
<form id="form_login" action = {% url 'login_view' %} method = "POST"> {% csrf_token %}
{{ form.phone }}
{{ form.verification}}
<button type="button" id="btn_SendSMS" class="btn btn-primary tall_button">get SMS</button>
<input type="submit" id="btn_login_submit" value="Login" class="btn btn-primary full_width_btn">
</form>
JAVASCRIPT
$(document).ready(function() {
var form = $("#form_login");
form.submit(function(e) {
e.preventDefault();
$.ajax ({
async: true,
type: form.attr('method'),
url: form.attr('action'),
data: form.serialize(),
success: function(response) {
if (response['status'] == 'success') {
window.location.replace(response['redirect']);
}
else {
alert(response['stage']);
siteNotification(response['error-message']);
}
},
error: function(response) {
alert('AJAX post failed... ' + response['stage'])
}
});
});
});
查看
class LoginView(View):
FormClass = LoginForm
response_template = 'login.html'
redirect_url_login = '/login'
redirect_url_customer = '/customer'
def post(self, request, *args, **kwargs):
JSONresponse = {}
JSONresponse['stage'] = '1. entered view'
form = self.FormClass(request.POST)
JSONresponse['status'] = 'failed'
JSONresponse['redirect'] = self.redirect_url_customer
if has_logged_in(request):
return HttpResponseRedirect(self.redirect_url_customer)
else:
if not request.is_ajax():
return HttpResponseRedirect(self.redirect_url_login)
else:
JSONresponse['stage'] = '2. before form data binding'
if form.is_valid():
JSONresponse['stage'] = '3. form is valid'
user = authenticate(phone = str(form.cleaned_data['phone']).strip(), password = str(form.cleaned_data['verification']).strip())
login(request, user)
JSONresponse['status'] = 'success'
#return HttpResponseRedirect(self.redirect_url_customer)
else:
JSONresponse['stage'] = '4. form is not valid'
JSONresponse['error-message'] = ''
for e in form.errors:
JSONresponse['error-message'] += e + ': ' + form.errors[e] + '<br>'
return HttpResponse(json.dumps(JSONresponse), content_type="application/json")
因此,我尝试通过大量这些JSONresponse['stage']
分配来确定代码在视图中的位置,从而尝试自行调试。如果表单完全空白并且我点击提交,则达到&#34; 4。表单无效&#34;,这是正确的,至少它正在评估表单,它给了我正确的表单验证错误。
但是,如果我在输入字段中输入几个随机字母并提交,它只会给我一个500错误(这是Chrome控制台中显示的内容)并且消息是&#34; AJAX发布失败...未定义&#34;。这意味着它已经达到了javascript的error
部分,但最后JSONresponse['stage']
的结果是&#34;未定义&#34;意味着它真的没有在视图中的任何地方。
这里发生了什么?也欢迎更好的方法来调试这些东西,我在开头的视图中加入import pdb; pdb.set_trace();
得到了一个&#34; BdbQuit&#34;错误....也不知道那里发生了什么。
编辑
当我做&#34; manage.py runserver&#34;并复制错误,这是控制台中显示的内容:[07 / Sep / 2015 21:34:27]&#34; POST / login / HTTP / 1.1&#34; 500 10511.那就是它,没有其他信息。