Djangoでカレンダーを作るシリーズ

プログラミング全般 - シリーズ、まとめ、チュートリアル
2018年10月30日14:58に更新(約14日前)
2018年10月7日16:08に作成(約37日前)

旧ブログ以降記事です。

動作環境

Python: 3.6以上
Django: 2.0以上

概要

Djangoで、カレンダアプリケーションを作成します。

例えば、月間カレンダー 月間カレンダー

週間カレンダー 週間カレンダー

各日のスケジュールも表示される、週間カレンダー スケジュールつき週間

曜日、日付、スケジュールを1行に収めたり... 週間の1行版

縦にするなども可能です。 週間カレンダー、縦ver

スケジュール付きの月間カレンダー等もできます。 月間カレンダーwithスケジュール

そして、これら全てを詰め込み、スケジュール作成ページもつけたカレンダー(Googleカレンダーのデフォルトページをイメージしました) Googleカレンダー風

各用途に合わせたMixinを作成しつつ、それらを実際にサンプルアプリケーションで利用していきます。

初期設定

Mixinやデフォルトモデルを定義する「scalendar」アプリケーション(sはsimpleのs)と、それを実際に利用する「sampleapp」という2つのDjangoアプリケーションを使います。

settings.py

設定ファイルに、2つのアプリケーションを足します。

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'scalendar',  # mixinとかいれる、ライブラリ的なポジ
    'sampleapp',  # ↑を実際につかうサンプルアプリ
]

urls.py

scalendarは読み込まなくてよいです。

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

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

scalendar/models.py

スケジュールを管理するモデルとして、以下のようなものを予め定義しておきます。

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


class Schedule(models.Model):
    """スケジュール"""
    summary = models.CharField('概要', max_length=50)
    description = models.TextField('詳細な説明', blank=True)
    start_time = models.TimeField('開始時間', default=datetime.time(7, 0, 0))
    end_time = models.TimeField('終了時間', default=datetime.time(7, 0, 0))
    date = models.DateField('日付')
    created_at = models.DateTimeField('作成日', default=timezone.now)

    def __str__(self):
        return self.summary

月間カレンダー

まずは月間カレンダーです。次月、前月といった移動も勿論できます。

週間カレンダー

週間カレンダー
その週ごとに表示する機能も、よく見かけます。こちらも、前週・次週へ移動できます。

スケジュール付き週間カレンダー

スケジュール付き週間カレンダー
週間カレンダーは少しさみしいものでした。なので、拡張してスケジュールも表示できるものを作ります。

スケジュール付き月間カレンダー

スケジュールつき月間カレンダー
今度はスケジュール付きの、月間カレンダーを作ります。

欲張りセット

Djangoで、週間・月間カレンダー
月間、週間カレンダーを独立したMixinとして定義したことで、それらを組み合わせることも容易です。 さらにgeneric.CreateViewも使い、スケジュール登録機能もつけてみます。

完成品(Github)

Githubにソースコードがあります。

うごかしかた。

git clone https://github.com/naritotakizawa/django-simple-calendar
pip install django (pipenv install でも)
python manage.py migrate
python manage.py runserver

記事にコメントする

名無し
2018年10月29日15:00にコメント(約15日前)

このスケジュールモデルだと、

start_time = models.TimeField('開始時間', default=datetime.time(7, 0, 0))において

TypeError: descriptor 'time' requires a 'datetime.datetime' object but received a 'int'

というようなエラーが出てしまいます。 何かコードに誤りがあるのではないでしょうか。

コメントに返信する

なりと
2018年10月30日11:22に返信(約15日前)

moels.pyでのimportを、from datetime import datetime のように書いていませんか。

そのエラーが出るのは、例えば以下のようなコードです。

from datetime import datetime
datetime.time(1, 0, 0)

正しくは以下のコードです。

import datetime
datetime.time(1, 0, 0)