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
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 %}