Django与Ajax
我正在尝试在Django中创建一个基本的应用程序,里面使用AJAX。这个应用会接收一个域名,然后把它发送到服务器,服务器会对这个域名进行DNS查询,最后通过AJAX把结果返回给客户端。
视图
from django.http import *
from django.shortcuts import render_to_response
from django.template import RequestContext
import sys
import os
import socket
def main(request):
if request.method == 'POST':
dig_input = request.POST['digInput']
digoutput = socket.gethostbyname(dig_input)
return render_to_response('digajax.html', {'response': digoutput}, context_instance=RequestContext(request))
else:
return render_to_response('digajax.html', context_instance=RequestContext(request))
网址
url(r'^digajax$', 'digajax.views.main'),
模板
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<script type='text/javascript' src='http://code.jquery.com/jquery-1.8.2.js'></script>
<script type="text/javascript">
function send_request(){
$.get(location.href, function(data){
$("#output").html(data.output);
});
}
</head>
<body>
<form method="post" name="diginput form" action="/digajax">
{% csrf_token %}
<input name="digInput" id="digInput" type="text">
<input type="button" onclick="send_request();" value="Request this page with AJAX">lookup</input>
</form>
{% if response %}
<div id="output">
<p>{{ response|linebreaksbr }}</p>
</div>
{% else %}
<p>no</p>
{% endif %}
</body}
</html>
在没有AJAX的情况下,一切都能正常工作。现在我想使用AJAX,但我不太清楚每个部分应该添加什么代码。
任何帮助都会非常感谢...............
1 个回答
1
- Django 提供了一个方法,可以在你视图中的
request
对象上使用,这个方法可以告诉你请求是否是通过XmlHttp
发出的,方法名是request.is_ajax()
。 - 如果这个方法返回的是 true,那你可能只想返回你想更新的页面的一小部分,而不是整个页面。
- 如果这个方法返回的是 false,那你可能想返回整个页面,因为用户可能关闭了 JavaScript,或者发生了某种错误,导致视图被正常请求。
所以,你的视图应该像这样:
def main(request):
if request.method == 'POST':
dig_input = request.POST['digInput']
digoutput = socket.gethostbyname(dig_input)
if request.is_ajax():
return HttpResponse("<p>%s</p>" % digoutput)
else:
return render(request, 'digajax.html', {
'response': digoutput
})
else:
return render(request, 'digajax.html')
你的 JavaScript 代码应该像这样:
<script type="text/javascript">
function send_request(){
$.get(location.href, function(data){
$("#output").html(data);
});
}
</script>