基本的,但是我花了两天时间,阅读了无数的教程,但我仍然无法做到这一点。简单地说,我试图完成一项基本任务,只是为了看到它工作。我想向我的捐赠视图发送 ajax 调用。我看到它成功通过,但我期望我的模板也会更新为"TRUE",但它仍然是"FALSE"。我感谢任何帮助或建议。
我的查询...
$.ajax({
type: "POST",
url:"/donate/",
data: {
'test': 'success',
},
success: function(){
alert('test')
},
error: function(){
alert("Error");
});
这是我的观点...
def donate(request):
if request.is_ajax():
test = "TRUE"
if request.method == 'POST':
form = DonateForm(request.POST)
if form.is_valid():
form.save()
else:
form = DonateForm()
test = "FALSE"
return render_to_response('donate_form.html', {'form':form,'test':test}, context_instance=RequestContext(request))
我的模板包括这个...
<h1>{{ test }}</h1>
更新/解决方案
就像在关于这个问题的评论中提到的,我没有对返回的数据做任何事情。我将我的成功电话更新为以下内容,它有效
$.ajax({
type: "POST",
url:"/donate/",
data: {
'zip': zip,
},
success: function(data){
results = $(data).find('#results').html()
$("#id_date").replaceWith("<span>" + results + "</span >");
},
error: function(){
alert("Error");
},
问题出在您传递数据的位置。你用Firebug
吗?检查是否传递任何内容的出色工具 POST
,它是一般Web开发的出色工具。
下面是从表单发送 Ajax 调用的工作示例
$("#form").submit(function(event) {
var $form = $(this),
$inputs = $form.find("input, select, button, textarea"),
serializedData = $form.serialize();
$.ajax({
url: "/donate/",
type: "post",
data: serializeData,
success: function(response) {
alert(response)
}
})
event.preventDefault();
});
然后你的视图可能看起来像这样
if request.is_ajax() or request.method == 'POST':
form = DonateForm(data=request.POST)
if form.is_valid():
return HttpResponse("Success")
else:
return HttpResponse("Fail")
顺便说一句,除非您真的需要$.ajax()
的所有附加功能,否则我建议您改用$.post()
,因为它似乎更易于使用。
我认为你的代码很少有问题......
-
你正在向 django 发送一个 POST 请求,没有csrf_token => django 不会为这个请求返回成功。您需要通过 POST 请求发送csrf_token。检查萤火虫。
-
即使 django 没有给出任何错误,那么您也不会在任何地方更改页面的内容(在浏览器上)......Djang将发回这个字符串->"成功"...就这样。
你需要像这样更改你的代码,
将"django.core.context_processors.csrf"添加到 settings.py 中的TEMPLATE_CONTEXT_PROCESSORS,以访问所有模板中的CSRF令牌。
您当前的模板:
<html>
<script type="text/javascript">
$("#form").submit(function(e) {
e.preventDefault();
serializedData = $("#form").serialize();
$.ajax({
url: "/donate/",
type: "post",
data: serializeData,
cache: 'false',
dataType: "json",
async: 'true',
success: function(data) {
alert(data)
},
error:function(data) {
alert("error in getting from server")
},
});
});
</script>
<body>
<form id="form">
{% csrf_token %}
{% for field in form %}
{{ field }}
{% endfor %}
</form>
<body>
</html>
捐赠视图:
def donate(request):
if request.method == 'POST':
form = DonateForm(data=request.POST)
if form.is_valid():
form.save()
return HttpResponse("SuccessFully Saved")
else:
return HttpResponse("Error in saving")
现在,您将看到:
- 成功完全保存 ->如果成功保存数据。
- 保存时出错 ->如果由于某种原因未保存数据。
- 从服务器获取时出错 -如果服务器响应了一些错误,则>。
request.is_ajax()
测试检查 HTTP_X_REQUESTED_WITH 标头是否存在,JQuery 在发送请求之前应该设置该标头。(如果您手动使用 XMLHttpRequest,您也必须手动添加该标头。我个人喜欢走不同的路线,因为它更容易测试并且不依赖于 HTTP 标头:向 URL 添加查询参数,例如"?type=ajax"。
然后,您将request.is_ajax()
更改为request.GET.get('type', null) == 'ajax'
,并在JavaScript中将url:"/donate/"
更改为url:"/donate/?type=ajax"
。
这种方法的好处是,您只需将该字符串添加到任何请求中,就可以在不使用 AJAX 的情况下测试这些调用?type=ajax
。