Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django和ICS文件_Django_Icalendar - Fatal编程技术网

Django和ICS文件

Django和ICS文件,django,icalendar,Django,Icalendar,我想让我网站的用户有机会导出/下载用于活动的小型ics文件。我知道您可以使用vObject库自动创建ics文件,但目前我们假设它们都是手动编写的,并存储在我的静态文件目录中 1) 如何在视图中返回这些文件? 2) 然后,我将如何呈现一个代表此的小图标?如何调用模板中的每个ics文件 我是Django的新手,所以放松点。除了我读过的文档之外,它略过了细节,但又没有涉及到基本内容 我想我必须在视图中的render_to_response()快捷方式中添加一个MIMEType参数,可能类似于 resp

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

1) 如何在视图中返回这些文件?
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?