Django】タスク管理アプリ開発(To-Doリスト)③ ~フォームの作成~

プログラミング
Masa
Masa

こんにちは!Masaです。

今日はタスク管理アプリ開発の続きをやっていきます!

この記事でわかること
  • タスク管理アプリの作成方法
  • 基本的なDjangoによるアプリ作成

前回までのおさらい

2回目までに以下のことを行いました。

  • models.pyやview.py、templateを作成し、画面表示できるようにしました。
  • 管理者画面からタスクを追加して、ブラウザ画面に表示することができました。

↓前回の記事

【Django】To-Doリスト② ~テンプレート作成と管理者画面の使い方~
Python・Djangoを用いてタスク管理アプリ(To-Doリスト)の作成をわかりやすく解説しています。今回はテンプレート作成と管理者画面の使い方です。データベースのテーブルに追加する方法をメインで解説しています。次回はフォームの作成方法です。

今回はフォームを作成し、アプリケーション上でタスクの登録を行えるようにしていきます。

forms.pyの作成

まず、”forms.py“というファイルをアプリケーションフォルダ(to_do_list)に作成してください。

forms.pyの使用用途としては、一般的に

  • 問い合わせ
  • webページからの入力や選択
  • 会員登録

などに使用します。
今回はタスクの追加に使用します。

forms.pyを作成したら、コードを記述していきましょう。
自分は以下のように記述しました。

from django import forms

from .models import(
    To_do,
)

class To_doForm(forms.ModelForm):
    class Meta:
        model = To_do
        fields = (
            'deadline',
            'task',
        )
        widgets = {
            'deadline': forms.NumberInput(attrs={
                "type": "date",
            })
        }

        def __init__(self, *args, **kwargs):
            super().__init__(*args, **kwargs)
            for field in self.fields.values():
                field.widget.attrs['class'] = 'form-control'

forms.pyについて解説していきます。

  • (1行目)モデルを利用したフォームクラスは、django.forms.ModelFormのサブクラスとして定義します。そのため、django.formsをインポートします。
  • (7行目)モデルを使用したフォームクラスを作成するため、django.forms.ModelFormを継承します
  • 使用するモデルを選択し(9行目)、使用するモデルフィールドを選択します(10行目以降)
  • 14行目以降のwidgetsはテンプレート上での見た目を指定したものとなります。詳しくは以下の記事を参考にしてください。
【Django】日付フォームをカレンダー入力する方法
Djangoの日付フォームをカレンダー入力する方法の解説です。カレンダー入力はAdminDateWidgetやDatetimePickerなどがありますが、より簡単にHTML5標準の機能でカレンダー入力を実装できます。
  • (20行目以降)この部分はフォームにBootstrapを適用しています。

モデルフォームを基本的な型は以下のような形です。
参考にしてください。

from django import forms

from .models import モデル名

class フォーム名(forms.ModelForm):
    class Meta:
        model = モデル名
        fields = (
            'フィールド1',
            'フィールド2'
        )

これでforms.pyの作成は終了です。

views.pyでフォームをテンプレートに渡す(おさらい)

※以下、先に実装済みですが、おさらいのため軽く解説します。

forms.pyを作成したら、次は作成したフォームクラスをテンプレートに渡します。

以下views.pyの一部抜粋部分にフォームが関係している場所をコメントしてあります。

from django.shortcuts import redirect
from django.views import generic
import datetime

from .models import To_do
from .forms import To_doForm #フォームをインポート

today = datetime.datetime.today().date()

class IndexView(generic.TemplateView):
    template_name = 'to_do_list/index.html'

    def get_context_data(self, **kwargs):
        incomplete_task = To_do.objects.filter(states="2", deadline__gt=today).all().order_by('deadline')
        after_deadline_task = To_do.objects.filter(states="2", deadline__lte=today).all().order_by('deadline')

        context = super().get_context_data(**kwargs)
        context["today"] = today
        context["complete_task"] = To_do.objects.filter(states="1").all().order_by('deadline')
        context["incomplete_task"] = incomplete_task
        context["after_deadline_task"] = after_deadline_task
        context["form"] = To_doForm() #フォームをcontextに格納し、テンプレートに渡す

    return context

フォームをテンプレートで表示する(おさらい)

※以下、先に実装済みですが、おさらいのため軽く解説します。

テンプレートにフォームを配置することで、アプリケーションでフォーム入力が可能となります。
以下、”index.html”のフォーム部分を抜粋しています。

form method="POST" enctype='multipart/form-data'>
 {% csrf_token %}
  <table class="table">
   {{ form.as_table }}
  </table>
  <div class="d-grid gap-2">
    <button class="btn btn-outline-primary" type="submit">作成</button>
  </div>
</form>
  • {% csrf_token %}はCSRFを検証するためのものであり、かならず記述しなくてはいけません。
  • {{ form.as_table }}でTo_DoFormが渡されました。
  • ”.as_table”はテーブル形式で表示と指定しています。

これで一通りコンポーネントを配置することができました。
ここで開発用サーバを起動してみましょう。

Djangoでタスク管理アプリ開発
タスク管理アプリ

それなりにアプリケーションぽくなったんではないでしょうか。

最後にフォームでタスクを登録された時の処理であるPOSTの処理とタスクの状態を変更したときの処理について簡単に解説します。

POSTとタスク状態変更時の処理

まずはPOSTの処理についてです。
POSTとはクライアントからデータを送信するための処理で、今回は新規のタスクをサーバに送信しています。

以下、POST時の処理を抜粋します。

def post(self, request):
    to_do = To_do()
    to_do_form = To_doForm(request.POST, instance=to_do)
    to_do_form.save()

    return redirect(to='/')

これはDjangoの基本的なPOST処理です。
これはかなりの頻度で使用するため、この形を覚えてしまった方が良いと思います。

次にタスク状態変更時の処理です。
これは「完了」ボタンをクリックすると「完了タスク」に移動する等の処理です

この部分を抜粋したものが以下になります。

 タスク状態変更時の処理
def Condition(self, num):

    task = To_do.objects.get(id=num)
    if task.states == "1":
        task.states = "2"
        task.save()
    else:
        task.states = "1"
        task.save()

    return redirect(to='/')

モデル”To_Do”は”states”というフィールドがあり、これは”item”から選択するようになっています。
itemは完了か未完了を持っているので、ボタンが押されたら状態を逆にする処理をしています。

statesでフィルタリングすることで、タスクの完了/未完了を分けています。

まとめ

今回はforms.pyを使ってタスクの追加を行いました。

現在のままだと登録したタスクの名前や期限を変更やタスクの削除ができません。
少し使い勝手が悪いので、次回は削除と変更を行えるようにしたいと思います。

↓次回の記事

【Django】タスク管理アプリ開発(To-Doリスト)④ ~削除・変更ボタン~
PythonとDjangoを使用してタスク管理アプリ(To_Doリスト)を作成しています。今回はタスクを完了と未完了に分類できるよう、ボタンを追加して随時モデルクラスを更新するようにしました。

コメント

タイトルとURLをコピーしました