【问题标题】:success function in ajax in djangodjango中ajax的成功函数
【发布时间】:2012-11-27 08:02:40
【问题描述】:

在视图中:

return render_to_response("main.html", RequestContext(request, {'form':form, "result":result}))

在模板中我有这个 jquery 函数:

$('#submitButton').click(function(e) {
            e.preventDefault();
            var dataPosted = $("#mainSubmit").serialize();
            $.ajax({
                type: "POST",
                data: dataPosted,
                url: 'main/',
                success: function(data) {
                    $("#mainDiv").html(data);
                    $(".response").html({{ result }});
                    $(".response").show();
                }
            });
        });
    });

<div id="mainDiv" class="part">
    <form id="mainSubmit" action="main/" method="POST" name="submitForm">
        {% csrf_token %}       
            {{ form.non_field_errors }}
            {{ form.as_p }}
        <input type="submit" value="Submit" id="submitButton"/>
        <div class="response"  style="display: none;"></div>
    </form>
</div>

但似乎无法将数据分配给这样的响应 div(似乎未定义数据)。所以我不知道将数据发送到模板的方式是什么。如果我在视图中使用Httpresponse(result),那么我不能刷新我的表单,只有我可以在响应中显示我从视图发送的 div 数据。那么方法是什么?

编辑: 这是我的看法。之前,我没有为条件 if form.is_valid(): 设置 else ,但我在这里使用,因为我认为如果我不这样做,可能会导致一些可能性。我不知道什么是最好的方法。

def mainFunc(request):
    if request.is_ajax():        
        if request.method == 'POST':
           form = mainForm(request.POST)
              if form.is_valid():             
                 // process the form     
                 result = "successful"
                 to_json = {'form':form, 'result':result}
                 return HttpResponse(json.dumps(to_json), mimetype='application/json')
              else:
                  result = ""
                  to_json = {'form':form, 'result':result}
                  return HttpResponse(json.dumps(to_json), mimetype='application/json')
        else:
            form = mainForm()
            return render_to_response('main.html', RequestContext(request, {'form':form}))
    else:
        return render_to_response("ajax.html", {}, context_instance=RequestContext(request))

【问题讨论】:

  • 您必须提供更多详细信息。第一个代码示例来自views.py,但它看起来是呈现整个页面的视图。响应表单的 POST 操作的方法在哪里?那是一样的吗?此外,动作是'main/'。这不是绝对的 URL。你不是以'main/main/main/' URL结尾吗?表单提交是否有任何数据返回? (提示:使用萤火虫或类似的东西)
  • 那不行:$(".response").html({{ result }});
  • 我编辑了我的问题。谢谢:)

标签: django jquery django-views


【解决方案1】:

您需要以 JSON 等格式返回响应

您可以使用this snippet 或更简单的代码,如下所示:

from django.utils import simplejson
to_json = {'form':form, "result":result}
return HttpResponse(simplejson.dumps(to_json), mimetype='application/json')

然后你就可以在你的JS代码中使用data.resultdata.form了。

如果您对 ajax 和非 ajax 调用使用相同的视图,您可以使用 request.is_ajax() 进行检查

此外,您将无法在 JS 回调中使用模板标签和过滤器。因此,您需要在通过 JSON 发送表单之前预渲染表单

所以最后的代码:

to_json = {'form':form, "result":result}
if request.is_ajax():
    to_json['form'] = to_json['form'].as_p()
    return HttpResponse(simplejson.dumps(to_json), mimetype='application/json')
else:
    render_to_response("main.html", RequestContext(request, {'form':form, "result":result}))

编辑我假设ajax.html是整个页面的模板,main.htmlmainDiv部分页面的模板

所以在is_ajax()的部分视图中,您可以像这样返回数据。

to_json = {}
to_json['form'] = render_to_string('main.html', {'form': form}, context_instance=RequestContext(request))
to_json['result'] = result
return HttpResponse(json.dumps(to_json), mimetype='application/json')

对于 GET 和 POST AJAX 调用,您总是返回这样的数据

在 JS 中你会得到这样的数据:

$("#mainDiv").html(data.form);
$(".response").html(data.result);
$(".response").show();

【讨论】:

  • 谢谢。抱歉,我以前从未使用过 json,我使用过这段代码,但什么也没发生。我编辑了我的问题。当表单无效时我需要显示表单错误并且我想确切地知道在这种情况下我应该做什么。使用 HttpResponse 或 render_to_response,因为我认为在这两种情况下(表单有效和表单无效)都会执行 jquery 成功函数,并且仅在第一次加载页面且方法未发布时,我应该使用 render_to_response。这是真的吗?
  • 我应该使用 mimetype='application/json' 吗?什么时候?如果我不这样做有什么问题?抱歉,我是网络编程新手,非常感谢您的帮助:)
  • render_to_response 是一个快捷方式,它也返回 HttpResponse 对象。 JSON是数据序列化的格式,正确的mimetype会让JQuery自动解析。实际上,没有必要将 JSON 返回到 ajax 调用,您可以返回 html 或纯文本,或 XML...但是,如果您的视图以单一格式返回响应,对您来说会更容易。
猜你喜欢
  • 2014-06-28
  • 2014-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-07
  • 2012-07-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多