Django e-commerce part42 Add to Cart from Product View
Product Viewから、Cartにitemを追加する
product_detail.html にコードを追記する。
タグ、ボタンを追加
<form method='GET' action="{% url 'cart' %}"> <select class='form-control variation_select'> {% for vari_obj in object.variation_set.all %} <!-- <option data-img="https://dlmarket-jp.s3.amazonaws.com/images/consignors/21/2170/umi_hawai_back.jpg" data-price="{{ vari_obj.price }}" value="{{ vari_obj.id }}">{{ vari_obj }}</option> --> <option name='item' data-sale-price="{{ vari_obj.sale_price}}" data-price="{{ vari_obj.price }}" value="{{ vari_obj.id }}">{{ vari_obj }}</option> {% endfor %} </select> {% else %} <h3 id='price'> {% if object.variation_set.first.sale_price %} {{ object.variation_set.first.sale_price }} <small class='og-price'>{{ object.variation_set.first.price }}</small> {% else %} {{ object.variation_set.first.price }} {% endif %} </h3> {% endif %} <br/> <input type='submit' value='カートに入れる' class='btn btn-default'/> </form>
これを追記した上で、カートに入れるボタンを押すと、ブラウザには、http://127.0.0.1:8000/cart/?
と表記される。
そのため、ちょっと修正する。
<select name='item' class='form-control variation_select'>
name = 'item'
は、select タブに入れる。
上記のコードの解説
の、value の部分が、?item=2などの2の部分に該当する。
なぜitemを指定するかというと、carts/view.html で、itemとして指定されていると、carts/views.pyのrequestで、item=2を拾って、variationと結びつけてくれるから。
ただ、上記のコードのまま実行すると、エラーが出る。多分qtyが入っていないから。
carts/views.py にコードを追記
qtyをrequest.GET.get の時に仮の値として、1を入れておく。また、1未満の場合は、そのアイテムを消してそれ以外の場合は、raise 404を設定する。
def get(self, request, *args, **kwargs): cart = self.get_object() item_id = request.GET.get("item") delete_item = request.GET.get("delete") if item_id: item_instance = get_object_or_404(Variation, id=item_id) qty = request.GET.get("qty", 1) try: if qty < 1: delete_item = True except: raise Http404
これでとりあえず、errorは解消されるはず。 たた、qtyは、int(qty) に変更する必要あり。多分そうしないと、qtyが文字列として認識されてしまい、raise Http404を上げる可能性あり。
carts/views.py にさらにコード追記
variationがない場合にもitemが反映されるようにする。
# <form>タグは、条件分岐の前に入れておく。 <form method='GET' action="{% url 'cart' %}"> # こちらは、variationがある場合 {% if object.variation_set.count > 1 %} <h3 id='price'>{{ object.variation_set.first.price }}</h3> <select name='item' class='form-control variation_select'> {% for vari_obj in object.variation_set.all %} <!-- <option data-img="https://dlmarket-jp.s3.amazonaws.com/images/consignors/21/2170/umi_hawai_back.jpg" data-price="{{ vari_obj.price }}" value="{{ vari_obj.id }}">{{ vari_obj }}</option> --> <option data-sale-price="{{ vari_obj.sale_price}}" data-price="{{ vari_obj.price }}" value="{{ vari_obj.id }}">{{ vari_obj }}</option> {% endfor %} </select> # こちらは、variationがない場合 {% else %} <input type="hidden" name='item' value='{{object.variation_set.first.id}}'> <h3 id='price'> {% if object.variation_set.first.sale_price %} {{ object.variation_set.first.sale_price }} <small class='og-price'>{{ object.variation_set.first.price }}</small> {% else %} {{ object.variation_set.first.price }} {% endif %} </h3> {% endif %}
qty のフォームボックスを追加する
<br/> <input class='form-control' type='number' name='qty' value='1' /> <br/> <input type='submit' value='カートに入れる' class='btn btn-default'/> </form>
tyr文のおさらい
tryは、 t実行できた場合は、tryだけが実行される。 errorが出て実行できなかった場合、exceptが発動する。
if item_id: item_instance = get_object_or_404(Variation, id=item_id) qty = request.GET.get("qty", 1) try: if int(qty) < 1: delete_item = True except: raise Http404
ここはちょっと難しかった。。。。