Djangoroidの奮闘記

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

Django e-commerce part53 Checkout View

CheckoutView

carts/views.py

views.py にCheckout Viewを作成する。DetailViewを継承して、class based viewを作成する。

class CheckoutView(DetailView):
    model = Cart
    template_name = "carts/checkout_view.html"

carts/views.py に追記

class CheckoutView(DetailView):
    model = Cart
    template_name = "carts/checkout_view.html"

    def get_object(self, *args, **kwargs):
        cart_id = self.request.session.get("cart_id")
        if cart_id == None:
            return redirect("cart")
        cart = Cart.objects.get(id=cart_id)
        return cart
  • セッションから、cart_idをゲットする。
  • cart_idがない場合は、cartにredirectする。
  • cart_idをキーにして、Cartのinstanceをゲットする。

checkout_view.html を修正する。

{% extends "base.html" %}


{% block content %}

{% endblock %}

views.py を少し修正する

class CheckoutView(DetailView):
    model = Cart
    template_name = "carts/checkout_view.html"
...
    def get_context_data(self, *args, **kwargs):
        context = super(CheckoutView,self).get_context_data(*args, **kwargs)
        if not self.request.user.is_authenticated():
            context["user_auth"] = False
        return context
...

contextに、user_auth : False を渡す。 ログインしていない時は、Falseになる。

carts/views.py に、 AuthenticationForm をimportする。

公式解説はこちら

Djangoの認証システムを使用する | Django documentation | Django

from django.contrib.auth.forms import AuthenticationForm
...
            context["login_form"] = AuthenticationForm()
...

login_formをcontextで、渡す。

checkout_view.htmlにcontextを表示させてみる。

{% extends "base.html" %}


{% block content %}

{{ user_auth }}

{{ login_form }}

{% endblock %}

checkout_view.html に追記する。

フォームの箇所は、django-resistration-reduxの、ログインページのtemplateから引っ張ってくる。url 'auth_login'

{% extends "base.html" %}
{% load i18n %}
{% load crispy_forms_tags %}

{% block content %}

{% if not user_auth %}
<div class='col-sm-6'>
<p class="lead">ゲストユーザーとして買い物を続ける</p>
</div>

<div class='col-sm-6'>
<p class="lead">ログインして買い物を続ける</p>
<form method='POST' action="{% url 'auth_login' %}"> {% csrf_token %}
{{ login_form|crispy }}

<input type='submit' class='btn btn-success' value='login' />
</form>

<p class='text-center'>
    <p>{% trans "パスワードを忘れた方は" %}<a href="{% url 'auth_password_reset' %}">{% trans "パスワードの再設定" %}</a>をお願いします。</p>
    <p>{% trans "アカウントをお持ちでない方は" %}<a href="{% url 'registration_register' %}">{% trans "アカウント登録" %}</a>をお願いします。</p>
</p>
</div>
{% endif %}

{% endblock %}

ログインした後に、つながるページの設定をする。

class CheckoutView(DetailView) に、build_abolute_uri()で、絶対パスをnext_urlとしてtemplateに渡す。

class CheckoutView(DetailView):
            context["next_url"] = self.request.build_absolute_uri()

checkout_viewに、next_urlを渡す。

<input type='hidden' name='next' value='{{ next_url }}'/>

ログインしているかしてないかで、表示を変更する。

carts/views.py

class CheckoutView(DetailView):
    model = Cart
    template_name = "carts/checkout_view.html"

    def get_object(self, *args, **kwargs):
        cart_id = self.request.session.get("cart_id")
        if cart_id == None:
            return redirect("cart")
        cart = Cart.objects.get(id=cart_id)
        return cart

    def get_context_data(self, *args, **kwargs):
        context = super(CheckoutView,self).get_context_data(*args, **kwargs)
        user_can_continue = False
        if not self.request.user.is_authenticated():# or if request.user.is_guest:
            context["login_form"] = AuthenticationForm()
            context["next_url"] = self.request.build_absolute_uri()
        if self.request.user.is_authenticated():
            user_can_continue = True
        context["user_can_continue"] = user_can_continue
        return context

checkout_view.html

{% extends "base.html" %}
{% load i18n %}
{% load crispy_forms_tags %}

{% block content %}

{% if not user_can_continue %}
<div class='col-sm-6'>
<p class="lead">ゲストユーザーとして買い物を続ける</p>
</div>

<div class='col-sm-6'>
<p class="lead">ログインして買い物を続ける</p>
<form method='POST' action="{% url 'auth_login' %}"> {% csrf_token %}
{{ login_form|crispy }}

<input type='hidden' name='next' value='{{ next_url }}'/>
<input type='submit' class='btn btn-success' value='login' />
</form>

<p class='text-center'>
    <p>{% trans "パスワードを忘れた方は" %}<a href="{% url 'auth_password_reset' %}">{% trans "パスワードの再設定" %}</a>をお願いします。</p>
    <p>{% trans "アカウントをお持ちでない方は" %}<a href="{% url 'registration_register' %}">{% trans "アカウント登録" %}</a>をお願いします。</p>
</p>
</div>
{% endif %}

{% endblock %}