Django和ICS文件
我想让我网站的用户有机会导出/下载用于活动的小型ics文件。我知道您可以使用vObject库自动创建ics文件,但目前我们假设它们都是手动编写的,并存储在我的静态文件目录中 1) 如何在视图中返回这些文件?Django和ICS文件,django,icalendar,Django,Icalendar,我想让我网站的用户有机会导出/下载用于活动的小型ics文件。我知道您可以使用vObject库自动创建ics文件,但目前我们假设它们都是手动编写的,并存储在我的静态文件目录中 1) 如何在视图中返回这些文件? 2) 然后,我将如何呈现一个代表此的小图标?如何调用模板中的每个ics文件 我是Django的新手,所以放松点。除了我读过的文档之外,它略过了细节,但又没有涉及到基本内容 我想我必须在视图中的render_to_response()快捷方式中添加一个MIMEType参数,可能类似于 resp
2) 然后,我将如何呈现一个代表此的小图标?如何调用模板中的每个ics文件 我是Django的新手,所以放松点。除了我读过的文档之外,它略过了细节,但又没有涉及到基本内容 我想我必须在视图中的render_to_response()快捷方式中添加一个MIMEType参数,可能类似于
response = render_to_response(events.html, mimetype='text/calendar')
但从那以后我就被困住了?有人愿意透露一些情况吗
补充:在Django的书中,第11章始终使用HttpResponse,而不是示例中的render_to_response()。。。但是render_to_响应仍然可以接受mimetype参数,所以这里没有问题,对吗
添加2:如果调用视图时没有创建ics文件,我猜这会使动态呈现事件页面时调用静态文件变得非常困难?我过去就是这样做的。我有一个文件模型,它有路径、文件名和下载名字段。在本例中,f表示数据库中的文件对象。这是视图中用于下载文件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 %}
.下载{光标:指针;边框:无;}
.
.
.
{文件列表%中的文件为%0}
{%endfor%}
当然,如果在模型中存储文件详细信息,则会出现这种情况。另外,您需要在url.py中创建一个条目来处理
url(r'^download/(?P\d+)$,'views.DownloadFile')
。我不确定你是如何得到你的文件列表的,但我会这样处理它们。如果它们是静态文件,你只需将它们与其他静态文件放在一起,让你的Web服务器像其他静态文件一样交付它们。Django根本不应该参与这个过程
编辑
这里的问题是,这都是理论上的,因为您实际上还没有选择这些文件是静态文件还是由Django动态创建的,而这种选择极大地改变了实现策略
如果要使用静态文件。然后,最明显的处理方法是将它们视为事件上的文件上载,即为ICS添加一个FileField
,然后在创建事件时附加静态文件。然后,当您循环浏览事件或其他内容时,您只需将ICS链接的href:{{event.my_ICS_field.url}
。但是,同样,这些文件将存储在您的MEDIA\u ROOT
目录中,该目录将由您的Web服务器而不是Django提供服务
或者,您可以为您的ICS文件设置某种命名方案(如事件ID),并将它们存储在应用程序的静态目录或添加到STATICFILES\u DIRS
的其他目录中。然后,在模板中组合URL,如/path/to/ics/files/{{event.pk}}.ics
。这种方式更加脆弱,最终结果也是一样的:您的Web服务器处理文件,Django对此毫不在意
但是,如果要动态地执行此操作,Django将需要参与实际服务文件,因为它将参与创建文件。您只需创建一个视图,该视图将创建ICS文件,并确保Django使用适当的mimetype返回响应。然后,您只需将其连接到一个urlpattern(其中包括事件的ID或slug之类的内容,以便视图知道为哪个事件创建ICS),并以正常方式在模板中引用该urlpattern,使用
{%url%}
难道不认为动态呈现事件列表会像这样简单吗?在不止一页上使用?谢谢!在我的情况下,将它们添加到模型中是最有意义的。我想现在终于可以工作了。我已经解决了媒体URL设置等问题。谢谢你,这很有意义。很好,我现在就来试试,谢谢。fid将显示事件主键,这也是日历文件的id?