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 ''


少しずつ進めます(笑)