質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

if

if文とは様々なプログラミング言語で使用される制御構文の一種であり、条件によって処理の流れを制御します。

リダイレクト

プログラムの入力元や出力先を通常とは別の場所に転送させることをリダイレクトと呼びます。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

2008閲覧

フォーム中のプルダウンで選択された値によって、送信時にリダイレクトするページを変える方法

Yu-Yokochi

総合スコア7

Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

if

if文とは様々なプログラミング言語で使用される制御構文の一種であり、条件によって処理の流れを制御します。

リダイレクト

プログラムの入力元や出力先を通常とは別の場所に転送させることをリダイレクトと呼びます。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/11/14 16:55

前提・実現したいこと

以下の仕様を実現したいです。

仕様:
決済方法を現金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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

Python

1 if form.is_valid() and request.POST.getlist('payway') == ['1']: 2 return redirect('cart:thanks') 3 elif form.is_valid() and request.POST.getlist('payway') == ['2']: 4 return redirect('cart:payjp')

投稿2020/11/15 16:20

Yu-Yokochi

総合スコア7

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問