pho@自習室

2011-06-30

Djangoでカレンダー

| 00:12

カレンダー機能をつけようってことになって、Javascriptでつくるかpythonでつくるか迷ったけど、pythonにHTMLCalendarなんて便利そうなものがあると知ったので、とりあえずpythonでつくることにした。HTMLCalendarの動作はこんな感じ。

import calendar

myCal = calendar.HTMLCalendar(calendar.SUNDAY)

print myCal.formatmonth(2009, 7)

html - python calendar.HTMLCalendar - Stack Overflow

引数に年と月を入れたら、HTMLのテーブルでカレンダーが返ってくる。便利そう。

これをDjangoでどう実現したらいいかなと思って探したらあった。

http://journal.uggedal.com/creating-a-flexible-monthly-calendar-in-django/

ここではmodels.pyとviews.pyのみが紹介されている。テンプレートについては

{{ calendar }}と書けばどこにでも挿入できるので明記されていない。

でもこれだけでは動かなくて、models.pyにWorkoutsというclassが必要。

class Workouts(models.Model):
    my_date = models.DateTimeField(auto_now_add=True, auto_now=False)
    workout = models.CharField(max_length=255, null=True, blank=True, verbose_name=_('workout'))

みたいなのがあればいいと思う。一つ思ったのは

field = lambda workout: workout.performed_at.day

の最後の部分はworkout.my_date.dayにしないといけないと思った。

get_absolute_url()も設定しておく必要がありそう。

これをカスタマイズしてカレンダーを作っている人がいたので参考にした。

http://drumcoder.co.uk/blog/2010/jun/13/monthly-calendar-django/

こっちはスタイルシートもあって、前の月、次の月への移動もできる。

この他、文字列操作が必要だったのでいくつかのサイトを参考にした。

文字列の長さを取得

http://www.pythonweb.jp/tutorial/string/index8.html

文字列の一部を取り出す

http://d.hatena.ne.jp/yumimue/20071223/1198407682

datetimeから年月日を取得

http://www.yukun.info/blog/2008/06/python-date.html

ちなみにlambdaはこんなふうに使うらしい。

http://atkonn.blogspot.com/2008/02/python-python27-lambda.html

カレンダーはそんなとこ。