Django - 提供一个ical文件

时间:2012-11-01 13:29:17

标签: django icalendar

我通过django_ical服务器作为icalender文件。问题是该文件名为download.ics。我正在尝试将其更改为MyCalender.ics。如果发现这个旧片段。我更喜欢使用django_ical,因为它与django联合很好地融合。

cal = vobject.iCalendar()
cal.add('method').value = 'PUBLISH'  # IE/Outlook needs this
for event in event_list:
     vevent = cal.add('vevent')
icalstream = cal.serialize()
response = HttpResponse(icalstream, mimetype='text/calendar')
response['Filename'] = 'filename.ics'  # IE needs this
response['Content-Disposition'] = 'attachment; filename=filename.ics'

1 个答案:

答案 0 :(得分:3)

django_ical中,ICalFeed继承自django.contrib.syndication.views.Feed

在您的应用中,您继承自ICalFeed,以提供itemsitem_title以及为ics文件生成数据的其他方法。

您可以覆盖__call__方法。致super的电话会向您发送HttpResponse,您将为其添加自定义标题。

代码如下:

class EventFeed(ICalFeed):
    """
    A simple event calender
    """
    product_id = '-//example.com//Example//EN'
    timezone = 'UTC'

    def items(self):
        return Event.objects.all().order_by('-start_datetime')

    # your other fields

    def __call__(self, request, *args, **kwargs):
        response = super(EventFeed, self).__call__(request, *args, **kwargs)
        if response.mimetype == 'text/calendar':
            response['Filename'] = 'filename.ics'  # IE needs this
            response['Content-Disposition'] = 'attachment; filename=filename.ics'
        return response

此代码未经过测试,因此可能存在一些拼写错误。如果在调用super时出现错误,您还需要捕获。我是通过response.mimetype == 'text/calendar'来做的,但也许有更好的方法来做到这一点