2012-03-06 9 views
0

私のウェブサイトのユーザーに、イベント用のsmallicsファイルをエクスポート/ダウンロードする機会を与えたいと思います。私はvObjectライブラリを使ってicsファイルを自動的に作成することができると理解していますが、当面はそれらがすべて手作業で作成され、静的ファイルディレクトリに保存されていると仮定できます。DjangoとICSファイル

1)これらのファイルをビューでどのように返すのですか?
2)これを表す小さなアイコンをどのようにレンダーするのですか?テンプレート内の各icsファイルをどのように呼び出すのですか?

私はDjangoを使いこなすので、簡単に行く。ドキュメントに加えて、私はthisを読みましたが、それは詳細をスキップし、thisしかし、再びfundementalsを扱っていません。

私は、ビューのショートカット)私は(render_to_responseにMIMEタイプのarguementを置く必要があるだろうと思います - おそらく私がこだわっているの

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

のようなしかし、そこから何か?どのような光を放つのに十分な種類ですか?

追加:Django Bookの章では、11章ではrender_to_response()ではなくHttpResponseを使用しています...しかし、render_to_responseはmimetype引数を取ることができますので、ここに問題はありません。

追加2:ビューが呼び出されたときにicsファイルが作成されない場合、これを推測すると、イベントのページを動的にレンダリングするときに静的ファイルを呼び出すのがかなり難しくなりますか?

答えて

1

静的ファイルの場合は、静的ファイルの残りの部分に置き、ウェブサーバーに他の静的ファイルと同じように配信させるだけです。 Djangoはプロセスに全く関与すべきではありません。ここ

EDIT

問題は、あなたが実際にこれらの意志実際に静的ファイルまたは動的にジャンゴで作成されたかどうかについての選択を行っていないので、これはすべての理論であるということであり、その選択は大幅に実装戦略を変更します。

静的ファイルを使用する場合は、次に、これを処理する最も明白な方法は、イベントでファイルのアップロードとして扱うことです。つまり、ICSにFileFieldを追加し、イベントを作成するときに静的ファイルを添付します。その後、あなたのイベントや何かをループしながら、ICSリンクのhrefをちょうど{{ event.my_ics_field.url }}にします。しかし、ここでもファイルはMEDIA_ROOTディレクトリに保存されます。このディレクトリは、DjangoではなくWebサーバーによって提供されます。

または、あなたのICSファイルのため(このようなイベントのIDなど)命名方式のいくつかの並べ替えを設定し、それらをあなたのアプリケーションの静的なディレクトリのいずれか、STATICFILES_DIRSに追加する他のディレクトリを格納することができます。次に、テンプレートのURLを/path/to/ics/files/{{ event.pk }}.icsのように作成します。この方法で少し壊れやすく、最終結果は同じです:あなたのWebサーバがファイルを扱い、Djangoはあまり気にしません。

しかし、これを動的に行うつもりなら、Djangoはファイルの作成に関与するため実際にファイルを提供する必要があります。 ICSファイルを作成するビューを作成し、Djangoが適切なMIMEタイプの応答を返すようにするだけです。次に、urlpattern(イベントのIDやスラッグのようなものが含まれているため、ICSを作成するイベントをビューで確認できるようになります)に接続し、テンプレートのurlpatternを通常の方法で{% url %}と参照するだけです。

+0

イベントのリストが動的にレンダリングされるのと同じくらい簡単になるとは思わないでしょうか?複数のページで使用できますか? – dannymilsom

+0

ありがとう!モデルにそれらを追加することは私の状況の中で最も理にかなっていると思います – dannymilsom

+0

最後に今はうまくいきました。私はMEDIA_URL設定などを取り組んできました。ありがとう – dannymilsom

1

これはこれまでのやり方です。 Files、path_name、およびdownload_nameフィールドを持つモデルがあります。この場合、fは自分のデータベースのFileオブジェクトを表します。 、私は、ファイルのダウンロードが含まれるであろう、あなたはすべてのICSファイルを表すことになり、あなたの静的ファイルのフォルダ内のGIF、ics.gifを持つことができるアイコンについて

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) 

:これは、ファイルfをダウンロードするためのビューのコードですユーザーはダウンロードするファイルを確認することができます。テンプレートでは、これらは次のようなリンクになります。

<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 %} 

もちろん、ファイルの詳細をモデルに保存する場合です。また、url(r'^download/(?P<fid>\d+)$', 'views.DownloadFile')を処理するには、urls.pyにエントリを作成する必要があります。どのようにあなたのファイルのリストを取得しているのか分かりませんが、これがどう扱うのでしょうか。

+0

意味があります。ニース私はそれに今感謝を爆発させるよ。また、イベントの主キーは、カレンダーファイルのIDにもなります。 – dannymilsom