Djangoroidの奮闘記

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

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>