Django e-commerce part65 Crafting the Order Part 4
Orderのアプリを完成させる
現時点では、ゲストとしてメールアドレスを入力すると、同じページにredirectされるようになっているため、この辺りを編集していく。
carts/views.py のCheckoutViewのget_context_data を修正する。
class CheckoutView(FormMixin, DetailView): ... def get_context_data(self, *args, **kwargs): context = super(CheckoutView, self).get_context_data(*args, **kwargs) user_can_continue = False user_check_id = self.request.session.get("user_checkout_id") if self.request.user.is_authenticated(): user_can_continue = True user_checkout, created = UserCheckout.objects.get_or_create(email=self.request.user.email) user_checkout.user = self.request.user user_checkout.save() self.request.session["user_checkout_id"] = user_checkout.id elif not self.request.user.is_authenticated() and user_check_id == None: context["login_form"] = AuthenticationForm() context["next_url"] = self.request.build_absolute_uri() else: pass if user_check_id != None: user_can_continue = True context["order"] = self.get_order() context["user_can_continue"] = user_can_continue context["form"] = self.get_form() return context
ポイント
- 全体的な流れとしては、ユーザーの場合 、非ユーザーで、emailも登録してない場合、非ユーザーだが、すでに一度emailは登録してる場合で処理を3つに分かれている。
address_select.html を少し修正する。
{% extends "base.html" %} {% load crispy_forms_tags %} {% block content %} <div class='col-sm-4 col-sm-offset-4 text-center'> <p class='lead'> 送付先のご住所を選択してください。 </p> <form method="POST" action=''>{% csrf_token %} {{ form|crispy }} <input class='btn btn-default' type='submit' value='選択する'> </form> </div> {% endblock %}
checkout_view.html に追記する。
<div class='col-sm-4 col-sm-offset-4 text-center'> <p><b>請求先住所:</b> <br/> {{ order.billing_address.get_address }} </p> <p><b>送付先住所:</b> <br/> {{ order.shipping_address.get_address }} </div>
orders/models.pyの、UserAddressに、get_addressメソッドを追記する。
class UserAddress(models.Model): user = models.ForeignKey(UserCheckout) type = models.CharField(max_length=120,choices=ADDRESS_TYPE) street = models.CharField(max_length=120) city = models.CharField(max_length=120) state = models.CharField(max_length=120) zipcode = models.CharField(max_length=120) def __str__(self): return self.street def get_address(self): return "%s, %s, %s, %s" %(self.street, self.city, self.state, self.zipcode)
carts/view.html にレジに進むボタン(checkout btn)をつける。
<tr> <td colspan='4' class='text-right'><a class='btn btn-default btn-warning' href="{% url 'checkout' %}">レジに進む</a></td> </tr>
carts/checkout_view.html
</p> <br/> <p><b>注文を確定する</b> </p> </div>