PythonのWebフレームワークDjangoでファイルの関係性を解説しながら、BMI計算アプリを作ってみる 〜その6〜

目次

Django

前回、BMI計算アプリで単位と初期値を表示するように変更しました。

今回は機能における最後の修正点「4. 出てきたBMI値の評価が分からない」を解決していきます。

BMIの評価は日本肥満学会が出しているので、分類はこんな感じになるとのことです。

分類BMI値
低体重(痩せ)18.5未満
普通体重18.5以上25.0未満
肥満(1度)25.0以上30.0未満
肥満(2度)30.0以上35.0未満
肥満(3度)35.0以上40.0未満
肥満(4度)40.0以上

BMIの数値を計算したのち、if関数を使って分類し、結果を表示するという流れで問題を解決できそうです。

ということでやってみましょう。

計算したBMI値を元に分類する

まずはBMI値を元に分類するプログラムを作っていきます。

/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

元々のプログラムはこう。

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['forms'] = BMIForm(request.POST)

        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)

この中で「if (request.method == ‘POST’):」以降が値が入力され、「submit」ボタンが押された後のプログラムですので、BMI値の評価のプログラムはここに書いていきます。

書き換えたプログラムがこちらです。

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['forms'] = BMIForm(request.POST)

        bmi = round(weight / ((height/100) * (height/100)), 1)
        optimal = round((height/100) * (height/100) * 22, 1)

        difference = round(abs(weight - optimal), 1)
        if bmi < 18.5:
            result = f'「痩せ」です。標準体重まで{difference}kgです。'
        elif 18.5 <= bmi < 25:
            result = f'「普通体重」です。'
        elif 25 <= bmi < 30:
            result = f'「肥満(1度)」です。標準体重より{difference}kg多いです。'
        elif 30 <= bmi < 35:
            result = f'「肥満(2度)」です。標準体重より{difference}kg多いです。'
        elif 35 <= bmi < 40:
            result = f'「肥満(3度)」です。標準体重より{difference}kg多いです。'
        elif 40 <= bmi:
            result = f'「肥満(4度)」です。標準体重より{difference}kg多いです。'

        params['bmi'] = bmi
        params['optimal'] = optimal
        params['result'] = result

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

if関数を使って結果の条件分岐をしているのはここです。

        difference = round(abs(weight - optimal), 1)
        if bmi < 18.5:
            result = f'「痩せ」です。標準体重まで{difference}kgです。'
        elif 18.5 <= bmi < 25:
            result = f'「普通体重」です。'
        elif 25 <= bmi < 30:
            result = f'「肥満(1度)」です。標準体重より{difference}kg多いです。'
        elif 30 <= bmi < 35:
            result = f'「肥満(2度)」です。標準体重より{difference}kg多いです。'
        elif 35 <= bmi < 40:
            result = f'「肥満(3度)」です。標準体重より{difference}kg多いです。'
        elif 40 <= bmi:
            result = f'「肥満(4度)」です。標準体重より{difference}kg多いです。'

まず最初に入力された体重と標準体重の差を取得しています。

difference = round(abs(weight - optimal), 1)

この際、値を絶対値として取得するため「abs()」を使っており、また小数点以下1位までとするため、round関数を用いています。

次にif関数を使って、BMI値によって条件分岐し、表示させたい文章を一度、変数resultに格納しています。

        if bmi < 18.5:
            result = f'「痩せ」です。標準体重まで{difference}kgです。'
        elif 18.5 <= bmi < 25:
            result = f'「普通体重」です。'
        elif 25 <= bmi < 30:
            result = f'「肥満(1度)」です。標準体重より{difference}kg多いです。'
        elif 30 <= bmi < 35:
            result = f'「肥満(2度)」です。標準体重より{difference}kg多いです。'
        elif 35 <= bmi < 40:
            result = f'「肥満(3度)」です。標準体重より{difference}kg多いです。'
        elif 40 <= bmi:
            result = f'「肥満(4度)」です。標準体重より{difference}kg多いです。'

この際、「f’文章{変数名}’」とすることで文章中に自然な形で変数を入れることができます。

そして取得したBMI値、適正体重、表示する結果をそれぞれparamsに辞書形式で格納しました。

        params['bmi'] = bmi
        params['optimal'] = optimal
        params['result'] = result

結果を表示する

次に結果を表示するため、/testapp2/bmiapp/templates/bmiapp/index.htmlを変更していきます。

testapp2
├── bmiapp
│   ├── __init__.py
│   ├── admin.py
│   ├── apps.py
│   ├── forms.py
│   ├── migrations
│   │   └── __init__.py
│   ├── models.py
│   ├── templates
│   │   └── bmiapp
│   │       └── index.html <-
│   ├── tests.py             | views.pyの情報が
│   ├── urls.py              | index.htmlで表示される
│   └── views.py ------------  
├── db.sqlite3
├── manage.py
└── testapp2
    ├── __init__.py
    ├── asgi.py
    ├── settings.py
    ├── urls.py
    └── wsgi.py

元々はこんな感じでした。

<!doctype html>
<html lang="ja">
<head>
    <meta charset="utf-8">
    <title>{{ title }}</title>
</head>
<body>
    <h1>{{ title }}</h1>
    <form action="{% url 'index' %}" method="post">
        {% csrf_token %}
        {{ forms.height.label }} {{ forms.height }} cm
        {{ forms.weight.label }} {{ forms.weight }} kg
        <input type='submit' value="click">
    </form>
    <p>{{bmi}}  {{optimal}}</p>
</body>
</html>

結果を表示するには、もうすでに辞書paramsに結果が格納されているため、{{ result }}をどこかに挿入するだけです。

ということで「<p>{{bmi}} {{optimal}}</p>」の下の行に挿入しましょう。

<!doctype html>
<html lang="ja">
<head>
    <meta charset="utf-8">
    <title>{{ title }}</title>
</head>
<body>
    <h1>{{ title }}</h1>
    <form action="{% url 'index' %}" method="post">
        {% csrf_token %}
        {{ forms.height.label }} {{ forms.height }} cm
        {{ forms.weight.label }} {{ forms.weight }} kg
        <input type='submit' value="click">
    </form>
    <p>{{bmi}}  {{optimal}}</p>
    <p>{{ result }}</p>
</body>
</html>

これで完了です。

実行してみましょう。

適正体重の時はこんな感じ。

少し太り気味な時はこんな感じ。

完全に肥満な場合はこんな感じ。

ちゃんとBMI値に応じて、表示される結果が変わり、分かりやすくなりました。

次回は全体のデザインを整えていきましょう。

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

よかったらシェアしてね!

コメント

コメントする

目次
閉じる