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 に答える