Django和ICS文件

时间:2012-03-06 16:22:04

标签: django icalendar

我想让我网站的用户有机会导出/下载活动的小型ics文件。我知道您可以使用vObject库自动创建ics文件,但暂时可以假设它们都是手动编写并存储在我的静态文件目录中。

1)如何在视图中返回这些文件?
2)然后我如何渲染一个代表这个的小图标?我如何调用模板中的每个ics文件?

我是Django的新手所以轻松一点。除了我阅读的文档this之外,它还跳过了详细信息和this,但同样没有涉及到基础知识。

我想我必须将MIMEType争论放入视图中的render_to_response()快捷方式 - 可能类似

response = render_to_response(events.html, mimetype='text/calendar')

但是从那以后我被卡住了?任何人都能放弃任何光明吗?

补充:在Django Book中,第11章总是在示例中使用HttpResponse而不是render_to_response()......但是render_to_response仍然可以采用mimetype争论,所以这里没有问题吗?

补充2:如果在调用视图时没有创建ics文件,我猜这会在动态渲染事件页面时调用静态文件非常困难吗?

2 个答案:

答案 0 :(得分:1)

这就是我过去的做法。我有一个Files的模型,它有path,file_name和download_name字段。在这种情况下,f表示来自我的数据库的File对象。这是下载文件f:

的视图中的代码
def DownloadFile(request, fid):
    f = File.objects.get(id=fid)
    response = HttpResponse(mimetype='application/force-download')
    response['Content-Disposition'] = 'attachment; filename=%s' % smart_str(f.download_name)
    response['X-Sendfile'] = smart_str(f.path + f.file_name)

对于图标,您可以在静态文件文件夹中有一个gif,ics.gif,它代表所有ICS文件,我会包含文件的下载名称,以便用户可以看到要下载的文件。在模板中,这些将是链接,例如:

<style type="text/css">
    .download{ cursor: pointer; border: none; }
</style>
.
.
.
{% for file in file_list %}
    <a href="/download/{{ file.id }}" target="_blank">
        <img src="/static/ics.gif" class="download" />
        {{ file.name }}
    </a>
    <br />
{% endfor %}

当然,如果您将文件详细信息存储在模型中。此外,您需要在urls.py中输入一个条目来处理url(r'^download/(?P<fid>\d+)$', 'views.DownloadFile')。我不确定你是如何得到你的文件列表的,但这就是我处理它们的方式。

答案 1 :(得分:1)

如果它们是静态文件,您只需将它们与其余静态文件放在一起,并让您的Web服务器像其他任何静态文件一样提供它们。 Django根本不应该参与这个过程。

修改

这里的问题是,这完全是理论上的,因为你实际上没有做出关于这些实际上是静态文件还是由Django动态创建的选择,并且该选择极大地改变了实现策略。

如果您要使用静态文件。然后,最明显的处理方法是将它们视为事件上的文件上传,即为ICS添加FileField,然后在创建事件时附加静态文件。然后,当您循环浏览事件或其他任何内容时,只需创建ICS链接的href:{{ event.my_ics_field.url }}。但是,再次,文件将存储在您的MEDIA_ROOT目录中,该目录将由您的网络服务器提供,而不是Django。

,您可以为ICS文件设置某种命名方案(例如事件ID),并将它们存储在应用程序的静态目录或您添加到{的其他目录中。 {1}}。然后,您在模板中撰写网址,例如STATICFILES_DIRS。这种方式更脆弱,最终结果是一样的:你的网络服务器处理文件,而Django也不在乎。

但是,如果您要动态执行此操作,Django将需要参与实际提供文件,因为它将参与创建它们。您只需创建一个将创建ICS文件的视图,并确保Django返回具有适当mimetype的响应。然后,您只需将其连接到urlpattern(其中包含事件的ID或slug等内容,以便视图知道要为其创建ICS的事件),并以正常方式引用模板中的urlpattern,{{1} }。