クライアントの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
まあ、私は理解していないです、問題は、私は多対多分野である「attached_products」を表示するべき私のテンプレートでをループしていますです特定の請求書に商品を添付する請求書モデル。これはまだそうするのだろうか? –
コンセプトはシンプルなので、 "あなたはクライアント側にHTMLを書き換えることはできません"。 djangoテンプレートエンジンはサーバー側のレンダリングでのみ動作します。 AJAXを使用すると動作しません。 JSでクライアント側のレンダリングを行う必要があります。 レンダリングされたHTMLは実際のPythonモデルではなく単に文字列であるため、MTMモデルとは関係ありません。 – Beomi
それは意味があります。あなたは、私の質問は、追いつくために関連性があると思いますか? –