1

毎週の小さなイベント カレンダーを作成しようとしています。月曜日から日曜日までの現在の週があります

これが私のモデルですEvent

class Event(models.Model):
    title = models.CharField(max_length=40)
    start = models.DateTimeField(default=datetime.datetime.now)
    end = models.DateTimeField(default=datetime.datetime.now)

    def __unicode__(self):
        return self.title

これは、この形式で日付を表示するビューです (10 月 21 日、10 月 22 日、10 月 23 日、10 月 24 日、10 月 25 日、10 月 26 日、10 月 27 日)

def events(request, template_name):
    today = datetime.date.today()
    weekday = today.weekday()
    start_delta = datetime.timedelta(days=weekday)
    start_of_week = today - start_delta
    week_dates = []
    for i in range(7):
        week_dates.append(start_of_week + datetime.timedelta(days=i))
    return render(request, template_name, {
        'week_dates': week_dates,
    })

私の質問は、その週の特定の日にイベントを表示/添付するにはどうすればよいですか? たとえば、ユーザーがstart日付を 10 月 22 日、end日付を 10 月 26 日に選択したとします。それぞれの日付の下にそれを照会して表示するにはどうすればよいでしょうか。

これは今のところ私の単純なテンプレートコードです。これはスタイリングのために変更する必要がありますが、この質問のために、ここでは最も単純な形式になっています。

    <div id="events">
        {% for d in week_dates %}
            {% for event in events %}
                {{ event.title}}
            {% endfor %}
            {{ d }}
        {% endfor %}
    </div>
4

3 に答える 3

1

あなたの質問から私が理解しているのは、イベントのカレンダーを表示したいということです。

私は私の見解でこのようなことをします:

 start_week  = date_a - timedelta(days = date_a.weekday())
 end_week    = date_b + timedelta(days = (7-date_b.weekday()))
 events = Event.objects.filter(Q(start_date__range=[start_week,end_week]) | end_date__range=[start_week, end__week])

event_map = {}

for i in range(7):
    event_map[(start_week + datetime.timedelta(days=i))] = []

for event in events:

    if event.end_date in event_map.keys() and event.start_date not in event_map.keys():
        day_count = (event.end_date - start_week).days
        for i in range(day_count):  
            event_map[event.end_date - timedelta(days=i)].append(event)

    if event.start_date in event_map.keys() and event.end_date not in event_map.keys():
        day_count = (end_week - event.start_date).days
        for i in range(day_count):
            event_map[event.start_date + timedelta(days=i)].append(event)

    else:
        day_count = event.end_date - event.start_date:
        for i in range(day_count):
            event_map[event.start_date+timedelta(days=i)].append(event)

これで、テンプレートで event_map を次のように使用できます。

{% for key,value in event_map.items %}
{{key}} -
 {% for i in value %}
  {{i}}
{%endfor%}
 <br>
{% endfor %}

プロジェクトでこれを試したことはありませんが、ロジックは問題ないようです。それが役に立てば幸い :)

于 2013-10-22T20:33:11.273 に答える
0

コンマで区切ってクエリに入れるだけです。完全な日付、日、月などを使用できます...

Sample.objects.filter(date__year='2011', date__year='2013')
于 2013-10-22T19:21:23.103 に答える