Djangoでカレンダー その4(ちょっと手直し)
月単位のカレンダーを表示する前に、時間単位の予定表をちょっとだけ手直ししました。
大した手直しではないのですが。。。
前回のテンプレートで以下ように記述していた部分をループで処理するように
しました。
{# 00:00 〜 23:00の時刻を表示 #} <div id="timeframe"> <div class="timelabel">Time</div> <div class="timeline">00:00</div> <div class="timeline">01:00</div> <div class="timeline">02:00</div> <div class="timeline">03:00</div> <div class="timeline">04:00</div> <div class="timeline">05:00</div> <div class="timeline">06:00</div> <div class="timeline">07:00</div> <div class="timeline">08:00</div> <div class="timeline">09:00</div> <div class="timeline">10:00</div> <div class="timeline">11:00</div> <div class="timeline">12:00</div> <div class="timeline">13:00</div> <div class="timeline">14:00</div> <div class="timeline">15:00</div> <div class="timeline">16:00</div> <div class="timeline">17:00</div> <div class="timeline">18:00</div> <div class="timeline">19:00</div> <div class="timeline">20:00</div> <div class="timeline">21:00</div> <div class="timeline">22:00</div> <div class="timeline">23:00</div> </div>
新しいテンプレートはこんな感じになっています。
{% extends "base.html" %} {% load calendar_templates %} {% block content %} <div id="container"> <div id="header1">{{year}} / {{month}} / {{day}}</div> {# 00:00 〜 23:00の時刻を表示 #} <div id="timeframe"> <div class="timelabel">Time</div> {% make_range 24 as hour_list %} {% for h in hour_list %} <div class="timeline">{{h|stringformat:"02d"}}:00</div> {% endfor %} </div> {# ユーザごとのタスクリストを取得して処理 #} {% for user, tasks in task_list.items %} {# ユーザ数をもとに、スタイルシートの列幅を指定 #} <div class="userframe width_user_x{{task_list.keys|length}}"> {# ユーザ名(ニックネーム)を表示 #} <div class="userlabel">{{user}}</div> {# 変数task_rowsに時系列のタスク情報を取得する #} {% daily_task_rows tasks as task_rows %} {# タスク情報の内容をもとに、時刻ごとのタスクを表示する #} {% for hours, tsk in task_rows %} {% if tsk %} {# 時刻にタスクが割り当てられている場合 #} <div class="taskfield timeunit{{hours|cut:"."}} active"> {{tsk}}({{tsk.time_start|time:"H:i"}} 〜 {{tsk.time_end|time:"H:i"}}) </div> {% else %} {# 時刻の場合にタスクが割り当てられていない場合 #} <div class="taskfield timeunit{{hours|cut:"."}} normal"></div> {% endif %} {% endfor %} </div> {% endfor %} <div class="clear"><hr/></div> </div> {% endblock content %}
上記のこの部分が新しく書き換えた部分です。
{# 00:00 〜 23:00の時刻を表示 #} <div id="timeframe"> <div class="timelabel">Time</div> {% make_range 24 as hour_list %} {% for h in hour_list %} <div class="timeline">{{h|stringformat:"02d"}}:00</div> {% endfor %} </div>
今回の修正でも、カスタムタグを1つ書きました。
make_range がそれです。
make_rangeはpythonのrange関数と同じように動きます。
上記のテンプレートの場合には、0〜23までの数値のリストを返します。
それをループで処理して時刻表示を行いました。
ちなみに、make_rangeタグはこんな感じです。
# # 値の範囲リストを作成 # @register.tag def make_range(parser, token): try: tag, args = token.contents.split(None, 1) except ValueError: tag = token.contents.split()[0] msg = '%r tag requires exactly one argument' % tag raise template.TemplateSyntaxError, msg match = re.search(r'(.*?) as (\w+)', args) if not match: msg = '%r tag had invalid arguments' % tag raise template.TemplateSyntaxError, msg numStr, varName = match.groups() return RangedNode(numStr, varName) class RangedNode(template.Node): def __init__(self, num, varName): self.num = num self.varName = varName def render(self, context): try: value = resolve_variable(self.num, context) except VariableDoesNotExist: value = self.num context[self.varName] = range(int(value)) return ''
少しずつ進めます(笑)