【Django】うるう年を判定するアプリの作成


投稿日 2019年7月9日 >> 更新日 2023年3月2日

今回は非常に簡易的なうるう年判定アプリをDjangoで実装していきたいと思います。

なお、こちらのアプリの元となっているのは過去に投降したグレゴリオ暦でうるう年を判定するプログラムに挑戦というスクリプトファイルのみで実装したものを使用するので、詳しく知りたい方はそちらに飛んでください。

前提としては、ブラウザにて「Hello World」などがテンプレートまで実装できている事とします。
※models.pyは使用しません。

# project/

project
    |
    |--app
    |      |
    |      |--templates
    |      |          |
    |      |          |--app
    |      |                |
    |      |                |--index.html
    |      |--urls.py
    |      |--views.py
    |
    |
    |--project
            |
            |--urls.py
            |--settings.py

実行環境&使用ライブラリ

実行環境
Windows Subsystem for Linux
Python 3.6.8
pip 9.0.1
使用ライブラリ ライセンス
Django==2.2.6 BSD

forms.pyの作成

まずはforms.pyとして、DjangoのFormクラスを継承して整数を受け取るためのフィールドを定義します。

のちにテンプレートで記述しますが、インプットタグからグレゴリオ暦を受け取り受け取った整数をviews.pyにて計算し返します。

# project/app/forms.py

from django import forms


class YearForm(forms.Form):
    number = forms.IntegerField()

次にYearFormクラスをviews.pyに渡します。

すでにindex関数が定義されている前提なので書き換えましょう。

最初は実装されているかテストとして、インプットされた整数をそのまま返すようなプログラムを記述したいと思います。

# project/app/views.py

from django.shortcuts import render
from .forms import YearForm


def index(request):

    if request.method == "GET":
        form = YearForm(request.GET)

        if form.is_valid():
            num = form.cleaned_data['number']
            return render(request, 'app/index.html', {'year':num})
        else:
            form = YearForm()

    return render(request, 'app/index.html')

テンプレートの記述。

inputタグのnameには、Formクラスで定義したフィールド名を渡しています。

{% if year %}の条件分岐ではmethod="GET"でTrueなら表示すると言った記述です。

<!-- project/app/templates/app/index.html -->

<!doctype html>
<html>
    <head>
    </head>
    <body>
        <a href="{% url 'app:index' %}"><p>トップ</p></a>

        <form method="GET">
            {% csrf_token %}
            <label>西暦:<input name="number">
            <input type="submit" value="Goo">
        </form>

        {% if year %}
            <h1 style="font-size: 100px;">{{ year }}</h1>
        {% endif %}

    </body>
</html>

このような表示になります。

何か数字を入力すると

そのまま返ってくれば成功です。

うるう年判定の実装

それではうるう年判定のプログラムを実装していきます。

先にも述べましたが、グレゴリオ暦でうるう年を判定するプログラムに挑戦の過去記事で実装したものをほぼそのままviews.pyのindex関数に渡しているだけです。

# project/app/views.py

from django.shortcuts import render
from .forms import YearForm

def index(request):

    if request.method == "GET":
        form = YearForm(request.GET)

        if form.is_valid():
            num = form.cleaned_data['number']
            """ うるう年判定プログラム """
            t1 = num / 4

            if t1 == int(t1):
                t2 = num / 100

                if t2 == int(t2):
                    t3 = num / 400

                    if t3 == int(t3):
                        return render(request, 'app/index.html',
                            {'year':'{}年はうるう年です'.format(num)})
                    else:
                        return render(request, 'app/index.html',
                            {'year':'{}年は平年です'.format(num)})

                else:
                    return render(request, 'app/index.html',
                            {'year':'{}年はうるう年です'.format(num)})

            else:
                return render(request, 'app/index.html',
                            {'year':'{}年は平年です'.format(num)})

        else:
            form = YearForm()

    return render(request, 'app/index.html')

単純な条件分岐での実装となりますが、もっと賢く実装できそうだと思った方はぜひ他のやり方も挑戦してみてください。

それでは表示させてみましょう。

最後にレイアウトなどを少し施して終わりにしたいと思います。

<!-- project/app/templates/app/index.html -->

<!doctype html>
<html>
    <head>
    </head>
    <body style="text-align: center; background-color: yellow;">

        <a href="{% url 'app:index' %}"><p>戻る</p></a>
        <p>グレゴリオ暦を入力してください</p>
        <br>

        <form method="GET">
            {% csrf_token %}
            <label>西暦:<input name="number">
            <input type="submit" value="Goo">
        </form>

        {% if year %}
            <h1 style="font-size: 100px;">{{ year }}</h1>
        {% endif %}

    </body>
</html>

これでDjangoによるうるう年判定アプリの実装は以上となります。

最後までご覧いただきありがとうございました。