【Django】ファイルの関係性を解説しながらBMI計算アプリの作成 その4[Python]

  • URLをコピーしました!
目次

Django

前回、BMI計算アプリでBMIを計算、数値を表示するところまで解説を行いました。

ただ以下の3点に関して、まだまだ機能の改善が必要そうなことが分かりました。

  1. 小数点以下の値が多すぎる
  2. 入力した値が計算後に消えてしまう
  3. Height(身長)とWeight(体重)の単位が書かれていないため、入力する数値が分かりにくい
  4. 出てきたBMI値の評価が分からない

今回は 簡単に修正できる「1. 小数点」と 「2. 値を保持」に関して改善をしていきましょう。

小数点以下の数字の桁数を変更

まずは小数点以下の数字の桁数を変更していきます。

計算式が書かれているファイルは/testapp2/bmiapp/views.pyです

testapp2
├── bmiapp
│   ├── __init__.py
│   ├── admin.py
│   ├── apps.py
│   ├── forms.py
│   ├── migrations
│   │   └── __init__.py
│   ├── models.py
│   ├── templates
│   │   └── bmiapp
│   │       └── index.html
│   ├── tests.py
│   ├── urls.py
│   └── views.py  <ーーこれ
├── db.sqlite3
├── manage.py
└── testapp2
    ├── __init__.py
    ├── asgi.py
    ├── settings.py
    ├── urls.py
    └── wsgi.py

「views.py」の中身はこのような感じでした。

from django.shortcuts import render
from django.http import HttpResponse
from .forms import BMIForm

def index(request):
    params = {
        'title':'BMI APP',
        'forms':BMIForm(),
    }
    if (request.method == 'POST'):
        height = int(request.POST['height'])
        weight = int(request.POST['weight'])

        params['bmi'] = weight / ((height/100) * (height/100))
        params['optimal'] = (height/100) * (height/100) * 22

    return render(request, 'bmiapp/index.html', params)

小数点以下の桁数はround関数を使って制御します。

round関数に関してはこちらの記事で解説していますので、よかったらどうぞ。

簡単に書くとこんな感じでした。

round(小数点, 小数点以下の桁数)

今回、小数点以下の桁数を減らしたいのはこの2行の部分です。

        params['bmi'] = weight / ((height/100) * (height/100))
        params['optimal'] = (height/100) * (height/100) * 22

ということでこう変更します。

        params['bmi'] = round(weight / ((height/100) * (height/100)), 1)
        params['optimal'] = round((height/100) * (height/100) * 22, 1)

これでBMI値、適正体重ともに小数点以下1位までの表示になったはずです。

ということで身長(Height)を170、体重(Weight)を60にして試してみました。

確かに小数点以下1位までの表示になりました。

入力した値が計算後に消えないようにする

次は入力した値が計算後にも表示されるように変更していきます。

これも先ほどと同じ/testapp2/bmiapp/views.py を修正していきます。

先ほど修正を加えるとviews.pyはこんな感じ。

from django.shortcuts import render
from django.http import HttpResponse
from .forms import BMIForm

def index(request):
    params = {
        'title':'BMI APP',
        'forms':BMIForm(),
    }
    if (request.method == 'POST'):
        height = int(request.POST['height'])
        weight = int(request.POST['weight'])

        params['bmi'] = round(weight / ((height/100) * (height/100)), 1)
        params['optimal'] = round((height/100) * (height/100) * 22, 1)

    return render(request, 'bmiapp/index.html', params)

実は値が消えないように保持するにはたった1行書くだけです。

params['forms'] = BMIForm(request.POST)

ここが何をやっているかというにはまずはparamsを見てください。

    params = {
        'title':'BMI APP',
        'forms':BMIForm(),
    }

paramsにはformsというキーが登録されていて、その中にはBMIForm()が入っています。

この時、BMIForm()と括弧に何も入っていない状態は、入力欄が空白ということのようです。

そこで「params[‘forms’] = BMIForm(request.POST)」では、paramsのformを上書きしていて、その内容が「BMIForm(request.POST)」。

そして「request.POST」は送信された内容、つまりは入力された数字を表しています。

ということでBMIForm(request.POST)は入力された値を再度BMIFormに入力した状態ということをです。

ややこしいかもしれませんが、単純にいうと入力された値を取得し、再度入力しているというわけです。

これを試してみるとこうなります。

これで「1. 小数点」と 「2. 値を保持」に関しては修正することができました。

次回は「3. Height(身長)とWeight(体重)の単位が書かれていないため、入力する数値が分かりにくい」を改善してきましょう。

ででは今回はこんな感じで。

よかったらシェアしてね!
  • URLをコピーしました!

コメント

コメントする

目次