Djangoroidの奮闘記

python,django,angularJS1~三十路過ぎたプログラマーの奮闘記

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>