Django HTMLCalendar上个月和下个月不会显示

时间:2019-11-06 06:11:13

标签: python html django

我是Django的新手,目前正在构建一个使用Django显示日历的应用程序。我一直在关注教程here,但是无法使上个月和下个月的按钮正常工作。当我转到http://127.0.0.1:8000/calendar时,可以看到本月的日历,但是当我按上个月/下个月时,什么也没有发生,只有URL更改为http://127.0.0.1:8000/calendar/?month=[this_year]-[this_month+/-1],这是我的视图类:

class CalendarView(generic.ListView):
    model = Event
    template_name = 'calendar.html'

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)

        d_obj = get_date(self.request.GET.get('day', None))

        cal = Calendar(d_obj.year, d_obj.month)

        html_cal = cal.formatmonth(withyear=True)
        context['calendar'] = mark_safe(html_cal)

        d_obj = get_date(self.request.GET.get('month', None))
        context['prev_month'] = prev_month(d_obj)
        context['next_month'] = next_month(d_obj)

        return context

def get_date(req_day):
    if req_day:
        year, month = (int(x) for x in req_day.split('-'))
        return datetime(year, month, day=1)
    return datetime.today()

def prev_month(d_obj):
    first = d_obj.replace(day=1)
    prev_month = first - timedelta(days=1)
    month = 'month=' + str(prev_month.year) + '-' + str(prev_month.month)
    return month

def next_month(d_obj):
    days_in_month = calendar.monthrange(d_obj.year, d_obj.month)[1]
    last = d_obj.replace(day=days_in_month)
    next_month = last + timedelta(days=1)
    month = 'month=' + str(next_month.year) + '-' + str(next_month.month)
    return month

我使用的是Django 2.2,所以我对网址做了一些更改:

urlpatterns = [
    path('calendar/', views.CalendarView.as_view(), name='calendar')
]

这是calendar.html文件的正文部分:

<div class="clearfix">
    <a class="btn btn-info left" href="{% url 'calendar' %}?{{ prev_month }}"> Previous Month 
    </a>
    <a class="btn btn-info right" href="{% url 'calendar' %}?{{ next_month }}"> Next Month 
    </a>
</div>

{{ calendar }}

在这里我做错什么了吗?

1 个答案:

答案 0 :(得分:1)

我知道这有点晚了,但是对于其他陷入此问题的人来说,这是上面代码中的问题:

class CalendarView(generic.ListView):
    model = Event
    template_name = 'calendar.html'

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)

        **d_obj = get_date(self.request.GET.get('month', None))**

        cal = Calendar(d_obj.year, d_obj.month)

        html_cal = cal.formatmonth(withyear=True)
        context['calendar'] = mark_safe(html_cal)
        context['prev_month'] = prev_month(d_obj)
        context['next_month'] = next_month(d_obj)

        return context