0

在意见中:

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))
4

1 回答 1

2

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

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

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

然后你就可以在你的JS代码中使用data.resultand了。data.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.html的模板,并且是mainDiv部分页面的模板

因此,在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();
于 2012-11-27T13:11:46.217 回答