前提・実現したいこと
以下の仕様を実現したいです。
仕様:
決済方法を現金orクレジットカードのどちらかを選択するCharFieldを含むフォームにおいて、
現金が選択された状態でフォームが送信されたら「ご注文ありがとうございました」と書かれたページ(cart/thanks.html)へ飛び、
クレジットカードが選択された状態でフォームが送信されたらカード情報入力ページ(cart/payjp.html)へ飛ぶ。
コード:
forms.py
Python
1from django import forms 2 3PAYWAY = ( 4 ('1','現金'), 5 ('2','クレジットカード'), 6) 7 8class OrderForm(forms.Form): 9 name = forms.CharField( 10 label='お名前', max_length=50 11 ) 12 payway = forms.ChoiceField(label='決済方法',choices=PAYWAY)
view.py
Python
1def contact_form(request): 2 if request.method == 'POST': 3 form = OrderForm(request.POST) 4 if form.is_valid() and OrderForm.payway == '1': 5 return redirect('cart:thanks') 6 elif form.is_valid() and OrderForm.payway == '2': 7 return redirect('cart:payjp') 8 else: 9 form = OrderForm() 10 return render(request, 'cart/form.html', {'form': form}) 11 12class PayView(View): 13 def get(self, request): 14 return render( 15 request, "cart/payjp.html", {"public_key":"pk_test_XXXXXXXXXXXXXXXXXXX"} 16 ) 17 18 def post(self, request): 19 amount = 100 20 payjp_token = request.POST.get("payjp-token") 21 customer = payjp.Customer.create(email="example@pay.jp", card=payjp_token) 22 charge = payjp.Charge.create( 23 amount=amount, 24 currency="jpy", 25 customer=customer.id, 26 description="Django example charge", 27 ) 28 context = {"amount": amount, "customer": customer, "charge": charge} 29 return render(request, 'cart/payjp.html', context) 30 31 32class Thanks(generic.TemplateView): 33 template_name = 'cart/thanks.html'
urls.py
Python
1from django.urls import path 2from . import views 3 4app_name='cart' 5 6urlpatterns = [ 7 path('form/', views.contact_form, name='form'), 8 path('thanks/',views.Thanks.as_view(), name='thanks'), 9 path('payjp/', views.PayView.as_view(), name="payjp"), 10]
form.html(フォームのテンプレート)
HTML
1{% extends 'cart/base.html' %} 2{% block content %} 3 <h1>注文フォーム</h1> 4 <form action="" method="POST"> 5 {{ form.non_field_errors }} 6 <div class="field"> 7 {{ form.name.label_tag }} 8 {{ form.name }} 9 {{ field.errors }} 10 </div> 11 <div class="field"> 12 {{ form.payway.label_tag }} 13 {{ form.payway }} 14 {{ field.errors }} 15 </div> 16 {% csrf_token %} 17 18 <!--略--> 19 20 <button type="submit" class="order">送信</button> 21 </form> 22{% endblock %}
発生している問題・エラーメッセージ
フォームを送信した時に以下のエラーがでます。
Internal Server Error: /cart/form/ Traceback (most recent call last): File "/Users/myname/.pyenv/versions/3.6.2/lib/python3.6/site-packages/django/core/handlers/exception.py", line 47, in inner response = get_response(request) File "/Users/myname/.pyenv/versions/3.6.2/lib/python3.6/site-packages/django/core/handlers/base.py", line 179, in _get_response response = wrapped_callback(request, *callback_args, **callback_kwargs) File "/Users/myname/project/cart/views.py", line 71, in contact_form if form.is_valid() and OrderForm.payway == '1': type object 'OrderForm' has no attribute 'payway'
試したこと
こちら
https://noumenon-th.net/programming/2019/11/12/django-validation/
を参考にしてm
forms.pyとview,pyを以下のように変更しました。
forms.py
Python
1from django import forms 2 3PAYWAY = ( 4 ('1','現金'), 5 ('2','クレジットカード'), 6) 7 8class OrderForm(forms.Form): 9 name = forms.CharField( 10 label='お名前', max_length=50 11 ) 12 address = forms.CharField( 13 label='お届け先', max_length=50, help_text='続きからご入力ください。' 14 ) 15 tel = forms.CharField( 16 label='電話番号', max_length=20 17 ) 18 email = forms.EmailField( 19 label='メールアドレス' 20 ) 21 payway = forms.ChoiceField(label='決済方法',choices=PAYWAY) 22 text = forms.CharField(label='特記事項', widget=forms.Textarea, required=False,help_text='辛味が苦手な方やアレルギーがある方はこちらにてお伝えください。') 23#以下を追加。 24 def clean(self): 25 payway = self.cleaned_data.get('payway')
view.py(変更したcontact_form関数のみ抜粋)
Python
1def contact_form(request): 2 if request.method == 'POST': 3 form = OrderForm(request.POST) 4 if form.is_valid() and payway == '1': 5 return redirect('cart:thanks') 6 elif form.is_valid() and payway == '2': 7 return redirect('cart:payjp') 8 else: 9 form = OrderForm() 10 return render(request, 'cart/form.html', {'form': form})
するとname 'payway' is not definedと言われたので、
view.pyを以下のように変更しました。
Python
1def contact_form(request): 2 if request.method == 'POST': 3 payway = self.cleaned_data.get('payway') 4 form = OrderForm(request.POST) 5 if form.is_valid() and payway == '1': 6 return redirect('cart:thanks') 7 elif form.is_valid() and payway == '2': 8 return redirect('cart:payjp') 9 else: 10 form = OrderForm() 11 return render(request, 'cart/form.html', {'form': form})
すると今度はname 'self' is not definedと言われたので、3行目のselfをOrderFormに変更したところ、type object 'OrderForm' has no attribute 'cleaned_dataというエラーが出ました。
さらにそのエラーを検索し、ヒットした記事とにらめっこしてみたのですが、全く正解への検討がつきませんでした。
非常に経験が浅く、周りに頼れる人もいないため、質問させていただくこととしました。
お手数おかけしますが、知恵をお貸しいただけないでしょうか。
よろしくお願いします。
補足情報(FW/ツールのバージョンなど)
Python 3.6.2
Django 2.0
開発環境:Mac
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。