我想让我网站的用户有机会导出/下载活动的小型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文件,我猜这会在动态渲染事件页面时调用静态文件非常困难吗?
答案 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} }。