【Django】タスク管理アプリ開発①(To-Doリスト)

プログラミング
Masa
Masa

こんにちは!Masaです。

今回はタスク管理アプリを作成していきたいと思います!

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

準備

環境構築などは以下の過去の記事を参考にして作成してください。

今回、task_managementというプロジェクトで、”to_do_listというアプリケーションを作成します。

ディレクトリ構成は以下のようになっています。

task_management
   - manage.py
   - task_management
      - __init__.py
      - setting.py
      - urls.py
      - asgi.py
      - wsgi.py
   - to_do_list
      - __init__.py
      - admin.py
      - apps.py
      - migrations
         - __init__.py
      - models.py
      - test.py
      - views.py

model.pyの作成

次にモデルを作成していきましょう。

モデルとはデータベースとアプリケーションをつなぐ役割があります。
1つのモデルが行と列の表のように考えてもらうとわかりやすいかもしれないです。

モデルはアプリケーションフォルダto_do_listにある、”models.py“に書き込んでいきます。

to_do_listのモデルに必要な項目は

  • タスクの期限
  • タスクが完了しているかどうか
  • タスク名

の3つとします。
※タスクが完了しているかどうかはシステム内で処理をするため、ユーザによる操作はないようにするつもりです。

from django.db import models
from django.utils import timezone

class To_do(models.Model):
    item = (
        ('1', '完了'),
        ('2', '未完了'),
    )
    states = models.CharField(max_length=1, choices=item, default='2')
    deadline = models.DateField(verbose_name="期日", blank=False, null=False, default=timezone.now)
    task = models.CharField(verbose_name="タスク名", blank=False, null=False, max_length=10)

    class Meta:
        verbose_name_plural = "Task"

    def __str__(self):
        return self.task

モデルのクラス名は大文字で始めるのがルールです。

“deadline”が締め切り、”task”がタスク名です。

“states”はタスクの状態を表しており、itemから選択する形となっています。
itemは辞書型のデータになっており、1の場合は完了、2の場合は未完了と定義してあります。

最後の__str__は文字列を返すという関数です。
“日付_やること”という返しになっています。
管理画面等でこのように表示されます。

views.pyの作成

次にアプリケーションフォルダ内にある、”views.py”を作成していきましょう。

ビューとは、リクエストされたことをもとにどのページを表示するかを決定する関数です。

今回はブラウザ1画面で収まる簡単なアプリケーションなので、ビューもおのずと簡単になります。

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')
     complete_task = To_do.objects.filter(states="1").all().order_by('deadline')

        context = super().get_context_data(**kwargs)
        context["today"] = today
        context["complete_task"] = complete_task
        context["incomplete_task"] = incomplete_task
        context["after_deadline_task"] = after_deadline_task
        context["form"] = To_doForm()

        # グラフのデータ取得
        number_of_incomplete_task = incomplete_task.count()
        number_of_after_deadline_task = after_deadline_task.count()
        context["number_of_incomplete_task"] = number_of_incomplete_task
        context["number_of_after_deadline_task"] = number_of_after_deadline_task

        number_of_task = []
        number_of_task.append(number_of_incomplete_task)
        number_of_task.append(number_of_after_deadline_task)
        context["number_of_task"] = number_of_task

        return context
    
    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='/')
    
    
# タスク状態変更時の処理
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='/')

todayは現在の年月日を取得しています。(8 行目)
日時取得の詳しい解説は以下を見てみてください。

【Python】日付・時刻(datetime)の扱い方
Pythonのdatetimeについて解説しています。datetimeはPythonの妙準モジュールであり、日付、時刻を扱うことができます。現在時刻を取得したり、見やすい文字列に変換する方法を実例付きで解説しています。

“TemplateView”を使用します(10行目)

13~22行目では”get_context_data”でテンプレートに渡すデータを取得しています。

25~33行目はグラフを表示する際にテンプレートに渡すデータです。
グラフの作成は今後行います。

37~40行目はフォームにて入力した新しいタスクをデータベースに保存する処理をしています。
フォーム送信時はPOSTの処理となります。

46~56 行目ではタスクを未完了から完了に変更する際に行う処理を記述した関数です。
実際アプリを動かすとよくわかると思うので、今はとりあえず記載して後ほど見直すといいと思います。

これでビューの作成は完了です。

templateを作成

次は、実際にwebページで表示するtemplateであるhtmlを作成していきます。
まず以下のようにディレクトリを作成します。

task_management
   - manage.py
   - task_management
      - __init__.py
      - setting.py
      - urls.py
      - asgi.py
      - wsgi.py
   - to_do_list
      - __init__.py
      - admin.py
      - apps.py
      - migrations
         - __init__.py
      - models.py
      - test.py
      - views.py
   - templates #ディレクトリ作成
      - to_do_list #ディレクトリ作成
         - index.html htmlファイル作成
     - base.html htmlファイル作成

templates“フォルダを作成し、この中にテンプレートを入れていきます。
フォルダ内でもアプリケーションによって区別できるよう、“to_do_list“フォルダも作ってください。

まだデザインの作成はしないので、今回はファイルを作成して終わりとします。

サーバを起動し、確認

これで一通り準備が完了しました。
最後に少し設定をします。

まず、モデルをアプリケーションフォルダ内の”admin.py”に登録します。

コードを追加して下さい。

from django.contrib import admin

#以下追加
from . models import To_do

admin.site.register(To_do)

次に”setting.py”にテンプレートの場所、アプリを記述します。
コードを追加して下さい。

import os #追加(14行目あたり)

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates')], #追加(60行名あたり)
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
            'libraries': {
                'asset_tag': 'asset.templatetags.asset_tag'
            }
        },
    },
]

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'to_do_list', #追加(40行目あたり)
]

最後にURLを登録します。
プロジェクトファイル内にある、”urls.py”を開き、次のコードを追加してください。

from django.contrib import admin
from django.urls import path, include #追加

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('to_do_list.urls')), #追加
]

そして、今度はアプリケーションファイル内に”urls.py”を新規に作り、以下のコードを記述してください。

from django.urls import path

from . import views

urlpatterns = [
    path('', views.IndexView.as_view(), name='index'),    
]

最後にデータベースのマイグレーションをします。
コマンドラインに以下の2行を入力してマイグレーションを行ってください。

python manage.py makemigrations
python manage.py migrate

開発用サーバを起動してみましょう。

python manage.py runserver

ブラウザにhttp://127.0.0.1:8000/を入力し真っ白のページが出てくれば成功です!
(index.htmlには何も記述していないため)

まとめ

今回はタスク管理アプリ作成のため、models.pyとviews.pyの作成、その他url等の設定を行いました。

次回以降、フォームの作成やデザインの作成を行っていきますので、ぜひ一緒にタスク管理アプリを作成していきましょう。

また誤植などありましたら、ご指摘いただけるとありがたいです。

次回の記事↓

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

コメント

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