web-dev-qa-db-ja.com

テキストとjsonオブジェクトを使用してDjangoでHttpResponseを返すことは可能ですか?

私のビュー関数で、jsonオブジェクト(data1)といくつかのtext/html(フォーム)を返したいと思います。これは可能ですか?

これが私のviews.pyの一部です:

if request.is_ajax() and request.method == 'POST':
...
    if form.is_valid():
        answer = form.cleaned_data['answer'] # Answer extracted from form is also a string
        a1 = ques1.correct_answer
                    if a1 == answer:
            test1 = question_list.get(id=nextid)
            form = AnswerForm(test1)
            ques1 = question_list.filter(id=nextid)                     # Filter next question as <qs>
            data1 = serializers.serialize("json",ques1)                 # Json-ize
    # ********EDITED HERE **********        
            variables1 = Context({
                'form' : form,
                'q1'   : data1,
            })  
            #response = HttpResponse()
            #response['data1'] = response.write(data1)
            #response['form'] = response.write(form) 
            if nextid <= qsnlen:
                return HttpResponse(variables1, mimetype="application/json")
                #return HttpResponse(response)
            else:
...

フォームhtmlとques1jsonオブジェクトの両方を返送したいと思います。これどうやってするの?前もって感謝します。

13
Harshil Parikh

両方のデータをJSONコンテナーに入れるだけで、1つのキーにはフォームデータが含まれ、もう1つのキーにはレンダリングされた文字列としてHTMLが含まれます。ブラウザでは、両方のキーを引き出して、自分のことを行うことができます。

あなたの見解では:

form_json_data = get_form_json_data()
rendered_html = get_the_html()
return HttpResponse(json.dumps({
        "formdata": form_json, 
        "html": rendered_html}),
    content_type="application/json")

Jsの場合:

$.post(foo, postdata, function(data){
    var formdata = data.formdata
    var html = data.html;
    $(".html-target").replaceWith(html);
    do_whatever(formdata);
})
11
AdamKG

使用 JsonResponse

from Django.http import JsonResponse
response_data = {put your data into a dict}
return JsonResponse(response_data, status=201)
4
i_emmanuel

1つの応答でこれを行うには;テンプレート応答(HTML)のコンテキストで、JSONをプレーンテキストとして送信する必要があります。

JSONを独自のmimeタイプを持つ個別のJSONオブジェクトとして送信する必要がある場合は、2つのビューを作成する必要があります。 1つはJSONをapplication/jsonとして送り返し、もう1つはフォーム(HTML)を送り返します。

編集:

JSONオブジェクトを返していませんが、2つの異なるタイプの2つのアイテムを含む辞書を作成しています。コメントで説明したように、1つの要求/応答サイクルで。コンテンツとブラウザでの処理方法に基づいた特定のmimeタイプを持つ1つの応答のみを返すことができます。ほとんどの場合、コンテンツタイプは'text/html'です。

シナリオで、HTML(フォーム)とJSON応答(文字列)の両方を返す場合は、HTMLを返す必要があります。

JSONをJSONオブジェクトとしてJqueryに返したい場合。リクエストタイプを検出する必要があります。フロントエンド(テンプレート)で、2つのリクエストを開始します。1つはブラウザからで、フォームに戻ります。もう1つはjQueryからのもので、適切なJSONオブジェクトを返します。

これに対する可能なアプローチは次のとおりです。

  def foo(request):
     if request.is_ajax():
        ctx = dict()
        ctx['hello'] = 'world'
        return HttpResponse(json.dumps(ctx),content_type='application/json')
     else:
        return HttpResponse('hello world')
0
Burhan Khalid