Django Ajax Jquery Call


这可能是

基本的,但是我花了两天时间,阅读了无数的教程,但我仍然无法做到这一点。简单地说,我试图完成一项基本任务,只是为了看到它工作。我想向我的捐赠视图发送 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(),因为它似乎更易于使用。

我认为你的代码很少有问题......

  1. 你正在向 django 发送一个 POST 请求,没有csrf_token => django 不会为这个请求返回成功。您需要通过 POST 请求发送csrf_token。检查萤火虫。

  2. 即使 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

最新更新