4
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Djangoのform機能を使ってBMI測定機を作成。我が体重への自戒を込めて。

Posted at

どうもjackです。
8月からPythonをメインにエンジニア業務に従事することになりまして。
諸事情により12月までに7キロの減量を目標に生きてる駆け出しエンジニアです。
今回は表題の通りDjangoのform機能を使ってBMI測定を行います。

ちなみに私の開発環境は以下となっています。

  • Python 3.6.7
  • Django 2.2.3
  • macOS

では、早速。

django-admin startproject qiita

をターミナルにて実行してアプリを作成!

cd qiita

作成したディレクトリへ移動。

python3 manage.py startapp bmi

上記にてbmiアプリを作成。

qiitaディレクトリにあるsettings.pyのINSTALLED_APPSにbmiを追記。

settings.py
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'bmi',

qiitaディレクトリにあるurls.pyの編集を行います。

urls.py
from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('bmi/', include('bmi.urls')),
]

合わせてbmiディレクトリにurls.pyのファイルを作成しておきましょう。
urls.pyの編集は後ほど。

qiitaディレクトリ
├── qiita
│   ├── __pycache__ 
│   ├── _init_.py
│   ├── setting.py
│   ├── urls.py
│   ├── views.py
│   └── wsgi.py
├── bmi
│   ├── migrations  
│   ├── _init_.py  
│   ├── admin.py
│   ├── apps.py
│   ├── models.py
│   ├── tests.py
│   ├── urls.py ←これ
│   └── views.py
└── manage.py

今回のbmiの計算に必要な数値は身長と体重の2つ。
この2つの値をformで受け取る為にまずはbmiディレクトリにforms.pyを作成。

qiitaディレクトリ
├── qiita
│   ├── __pycache__ 
│   ├── _init_.py
│   ├── setting.py
│   ├── urls.py
│   ├── views.py
│   └── wsgi.py
├── bmi
│   ├── migrations  
│   ├── _init_.py  
│   ├── admin.py
│   ├── apps.py
│   ├── forms.py ←これ
│   ├── models.py
│   ├── tests.py
│   ├── urls.py 
│   └── views.py
└── manage.py

んで持ってこのforms.pyを編集します。

forms.py
from django import forms

class BmiForm(forms.Form):
    weight = forms.IntegerField(label='weight')
    height = forms.IntegerField(label = 'height')

ではこの作成したformをviewにて関数を定義していきます。

views.py
from django.shortcuts import render
from .forms import BmiForm 
# Create your views here.
def bmi(request):
    params = {
    'title' :'BMI',
    'msg': 'enter your score',
    'form': BmiForm()
    }

    if (request.method=='POST'):
        msg = int(request.POST['weight']) / (int(request.POST['height'])/100 )**2
        params['msg'] = '{:.2f}'.format(msg)
        params['form'] = BmiForm(request.POST)

    return render(request, 'bmi/bmi.html', params)

paramsの部分は後ほど作成するhtmlに値を渡すための部分になります。

入力フォームを埋め込むhtmlを格納するtemplatesディレクトリを作成します。

qiitaディレクトリ
├── qiita
│   ├── __pycache__ 
│   ├── _init_.py
│   ├── setting.py
│   ├── urls.py
│   ├── views.py
│   └── wsgi.py
├── bmi
│   ├── migrations  
│   ├── templates
│   │      └── bmi
│   │           └── bmi.html ←ここ
│   ├── _init_.py  
│   ├── admin.py
│   ├── apps.py
│   ├── forms.py 
│   ├── models.py
│   ├── tests.py
│   ├── urls.py 
│   └── views.py
└── manage.py

そしてbmi.htmlを書いていきます。

bmi.html
<!DOCTYPE html>
<html lang="ja" dir="ltr">
  <head>
    <meta charset="utf-8">
    <title>{{title}}</title>
  </head>
  <body>
    <h1>{{title}}</h1>
    <p>{{msg}}</p>
    <table>
      <form action="{% url 'bmi' %}" method="post">
        {% csrf_token %}
        {{form}}
        <tr>
          <td></td><td><input type="submit" name="" value="send"></td>
        </tr>
      </form>
    </table>

  </body>
</html>

最後にurls.pyを編集して終了です。

urls.py
from django.urls import path, include
from . import views

urlpatterns = [
   path('', views.bmi, name='bmi'),
   ]

ターミナルを起動させてローカルサーバーを立ち上げましょう。

python3 manage.py runserver
スクリーンショット 2019-08-20 13.25.27.png

こういった表示が出れば完成です!!

実際に入力すると、、、

スクリーンショット 2019-08-20 13.27.17.png

でたーーーーー!!!!
ちなみに標準は22らしいです。泣

ではさよならさよならさよなら。

4
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?