2017-10-04 30 views
0

私はビューに値をPOSTするためにAJAX呼び出しを使用しています。 私の見解から、私はビューに渡された値(id)に基づいて製品を探しています。私はそれを私の請求書に加え、それを私の視点の下にレンダリングする私の文脈に適用します。コンテクストは私がリフレッシュするまで表示されませんが、私はそれを持つことはできません。ハマった。Djangoレンダリングのコンテキストがリフレッシュまで表示されませんか?

... 
elif request.is_ajax(): 
    product_id = request.POST.get('value') 
    if product_id: 
     product_info = Product.objects.get(id=product_id) 
     new_invoice_product = InvoiceProduct.objects.create(invoice_product_set=product_info) 
     invoice.attached_products.add(new_invoice_product) 
     context['attached_products'] = invoice.attached_products.all() 
... 

return render(request, 'inventory/invoice_create.html', context) 

答えて

-1

クライアントのHTML DOMをサーバーから直接再レンダリングすることはできません。

DjangoTemplate Engineを使用すると、HTML自体をレンダリングして応答するだけです。つまり、ルート要素を更新しない限り、クライアントのDOMをajaxで更新することはできません。<html> (これはページをリロードするのと同じです!)

DOMツリーをいくつかのデータで更新するには、ajax呼び出しを行い、jsonファイルのみで更新したい場合があります。 JsonResponseを使用すると、AJAXレスポンスオブジェクトで取得できます。

あなたがしなければならないことは、djangoテンプレートではなくJavaScriptプログラミングです。あなたのviews.pyで

、次のように実行します。

# in your views.py 
... 
elif request.is_ajax(): 
    product_id = request.POST.get('value') 
    if product_id: 
    product_info = Product.objects.get(id=product_id) 
    new_invoice_product = InvoiceProduct.objects.create(invoice_product_set=product_info) 
    invoice.attached_products.add(new_invoice_product) 
    context['attached_products'] = invoice.attached_products.all() 
    # return render(request, 'inventory/invoice_create.html', context) # NOT render but do like this: 
    return JsonResponse({ 
     'new_data': { 
      'id': new_invoice_product.id 
      # and other informations you want... 
     } 
    }) 

をあなたのHTMLでは、次のように実行します。

<script src="https://code.jquery.com/jquery-3.2.1.min.js" 
     integrity="sha256-hwg4gsxgFZhOsEEamdOYGBf13FyQuiTwlAQgxVSNgt4=" 
     crossorigin="anonymous"></script> 
<script> 
    // in your HTML 
    // guessing you're using jquery.. 
    $.ajax({ 
     url: "test.html", 
     context: document.body 
    }).done(function (json) { 
     $('yourSelector').append(json['new_data']['id']); 
    }); 
</script> 

は覚えておいて、このコードは単に完全に機能していないコードスニペットです。あなたはさらなる例を知りたい場合は、リンクを見てみましょう:

https://simpleisbetterthancomplex.com/tutorial/2016/08/29/how-to-work-with-ajax-request-with-django.html

+0

まあ、私は理解していないです、問題は、私は多対多分野である「attached_products」を表示するべき私のテンプレートでをループしていますです特定の請求書に商品を添付する請求書モデル。これはまだそうするのだろうか? –

+0

コンセプトはシンプルなので、 "あなたはクライアント側にHTMLを書き換えることはできません"。 djangoテンプレートエンジンはサーバー側のレンダリングでのみ動作します。 AJAXを使用すると動作しません。 JSでクライアント側のレンダリングを行う必要があります。 レンダリングされたHTMLは実際のPythonモデルではなく単に文字列であるため、MTMモデルとは関係ありません。 – Beomi

+0

それは意味があります。あなたは、私の質問は、追いつくために関連性があると思いますか? –

関連する問題