Django e-commerce part47 Ajax Part1
Ajax を使う part1
products/product_detail.html のform タグにidをつけていく
<form id='add-form' method='GET' action="{% url 'cart' %}">
<input class='form-control' type='number' name='qty' value='1' />
block jQuery にadd cartに関するajaxを書いていく。
<script> {% block jquery %} ... $("#submit-btn").click(function(event){ event.preventDefault(); var formData = $("#add-form").serialize(); console.log(formData); }) {% endblock %}
- submit-btnをclickした時に、
- preventDefault() で、本来の動作をpreventする(カートに移動する。)
- formDataに、add-formの実行データ?送信データ?を、シリアライズする。
- console.logに、formDataを表示させる。
シリアライズとは、ソフトウェア内部で扱っているデータを丸ごと、ファイルで保存したりネットワークで送受信することができるように変換すること。
.ajax を設定する。
$("#submit-btn").click(function(event){ event.preventDefault(); var formData = $("#add-form").serialize(); console.log(formData); $.ajax({ type: "GET", //"POST" url: "{% url 'cart' %}", data: formData, success: function(data){ console.log(data) }, error: function(response, error){ console.log(response) console.log(error) }, })
carts/views.py を設定する
from django.http import HttpResponseRedirect, Http404, JsonResponse ... def get(self, request, *args, **kwargs): cart = self.get_object() if request.is_ajax(): print (request.GET.get("item")) return JsonResponse({"success": True})
- .ajaxで、指定したurl に、ajaxからアクセスする時に、requestに、ajaxが表示される。
- ajaxがある場合は、JsonResponseで、JSON形式の、success :True を返す。JsonResponseについては、以下のサイトを参照
Request and response objects | Django documentation | Django
carts/views.py にdeleteをつけてみる。
def get ... if request.is_ajax(): return JsonResponse({"deleted": delete_item}) ...
JSON形式で、deleted : delete_item を返す。delete_itemは、getファンクションで、定義されているもの
さらに、item_addedも追加してみる。
def get(self, request, *args, **kwargs): ... cart_item, created = CartItem.objects.get_or_create(cart=cart, item=item_instance) # ここを修正した。 if created: item_added = True if delete_item: cart_item.delete() else: cart_item.quantity = qty cart_item.save() if request.is_ajax(): return JsonResponse({"deleted": delete_item, "item_added": item_added })
cart_item, created = CartItem.objects.get_or_create(cart=cart, item=item_instance)
で、cart_itemがある場合は、getで、ない場合は、createする。createdがtrue の場合、item_added = Trueにする。
item_addedをJsonresponseで返す。
全体として、すでにアイテムがある場合、削除する場合を区別するために、Jsonresponseを使っている。
product_detail.html のjqueryを修正する
$("#submit-btn").click(function(event){ event.preventDefault(); var formData = $("#add-form").serialize(); console.log(formData); $.ajax({ type: "GET", //"POST" url: "{% url 'cart' %}", data: formData, success: function(data){ $("#jquery-message").text("Added " + data.item_added + " Deleted " + data.deleted) }, error: function(response, error){ // console.log(response) // console.log(error) $("#add-form").submit() }, }) ... <p id='jquery-message' class='lead'></p>