Day14 Django session json 取り出し
# zip_code { "message": null, "results": [ { "address1":"北海道", "address2":"札幌市", "address3":"札幌", "kana1":"ホッカイドウ", "kana2":"サッポロシ", "kana3":"サッポロ", "prefcode":"1", "zipcode":"1000001" } ], "status":200 } { "message":null, "results":null, "status":200 } def fetch_address(zip_code): REQUEST_URL = f'http://zipcloud.ibsnet.co.jp/api/search?zipcode={zip_code}' address = ' ' response = request.get(REQUEST_URL) response = json.loads(response.text) result, api_status = response['results'], response['status'] if api_status == 200; result = result[0] address = result['address1'] + result['address2'] + result['address3'] return address
~~~~~get_address関数について~~~~~~~
・この関数はzip_codeで入力し、ちゃんと情報が返って来たら、その情報を合わせて返す。
・response = request.get(REQUEST_URL).............responseに、返ってきたURLを取得して、代入
・json.loads(response.text) .......... おそらくjson.loads()でresponse.textを読み込んでいる。ただresponse.textがなんでできるのかがわからない。
・result, api_status = response['results'], response['status'] .............. これでresultにresponse['results']を、api_statusにresponse['status']を入れる。
~~~~if文の中身~~~~~~~~
api_statusが200だったら、
resultに最初の辞書を入れる。
次にaddressに辞書の中身を追加する
addressを返す。
#Buy Form classBuyForm(forms.Form): zip_code = forms.CharField( label = '郵便番号', max_length = 7, required = False, widget=forms.TextInput(attrs={'placeholder': '数字7桁(ハイフンなし)'}) ) address = forms.CharField( label = '住所', max_length = 100, required = False )
・formで住所検索とアドレスを入力するフォームを作成
・label ......ただのラベルでは.....なかった。これはhtmlで参照する事ができるlabelらしい。例えばhtmlで{{ buy_form.zip_code.label_tag }}のように使う事ができるらしい。ありがとうございます!
Django - フォームの改造 - Qiita
@login_required def bag(request): user = request.user bag = request.session.get('bag', {}) bag_products = dict() total_price = 0 for product_id, num in bag.items(): product = Product.objects.get(id=product_id) bag_products[product] = num total_price = product.price * num buy_form = BuyForm(request.POST or None) if buy_form.is_valid(): if 'search_address' in request.POST: zip_code = request.POST['zip_code'] address = get_address(zip_code) if not address: messages.warning(request, "住所を取得できませんでした。") return redirect('app:bag') buy_form = BuyForm(initial={'zip_code':zip_code, 'address':address}) if 'buy_product' in request.POST: if not buy_form.cleaned_data['address']: messages.warning(request, "住所の入力は必須だ") return redirect('app:bag') if not bool(bag): messages.warning(request, "バッグは空やで") return redirect('app:bag') if total_price > user.point: messages.warning(request, "ポイントがねえぜ") return redirect('app:bag') for product_id, num in bag.items(): if not Product.objects.filter(pk=product_id).exists(): del bag[product_id] product = Product.objects.get(pk=product_id) sale = Sale(product=product, user=request.user, amount=num, price=product.price) sale.save() user.point -= total_price user.save() del request.session['bag'] messages.success(request, "商品の購入が完了や。") return redirect('app:bag') context = { 'buy_form': buy_form, 'bag_products': bag_products, 'total_price': total_price, }
・buy_form = BuyForm(request.POST or None) ............ buy_formにBuyFormでrequest.POSTを入れる
~~~~~~if文の中身~~~~~~~~~~
・buy_form.is_valid():......buy_formが有効だったら
・送られてきた情報が''search_addressだったら
・送られてきた情報からzip_codeを取り出す
・addressにget_address関数のzip_codeを入れて
・もしアドレスがなかったら...
・buy_formにBuyFormにinitialで初期値を設定。
・送られてきた情報が'buy_product'だったら
・もしbuy_formにaddressが入力されていなかったら
・bagが空か否か
・ポイント不足か否か
~~for文の中身~~~
・product_idとnumにbag辞書から取り出したキーとバリューを入れて
・もしproduct_idが存在していなかったら、
・bag辞書のproduct_idを削除
・productにProductテーブルからproduct_idをとってきて代入
・saleにSaleテーブルに入れる値を渡して代入
・保存
・total_priceからuserpointを減らす
・userを保存。
・終わったsessionを削除
・bag関数に返す。
・contextにbuy_formとbag_productsとtotal_priceをセット。