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をセット。