2012-08-08 15 views
6

ファイルパスにファイルを保存するFileモデルがあります。すべてのファイルはMEDIA_ROOT /ファイルに保存されますDjango:ダウンロードリンクを生成する

テンプレートでは、Fileオブジェクトのダウンロードリンクを生成します。これを行う最善の方法は何ですか?私はdjangoで静的なファイル操作を使用する必要がありますか?

TIA!アイテムのビューで

UPD

Fileモデル

class File(models.Model): 
    item = models.ForeignKey(Item) 
    file = models.FileField(upload_to = os.path.join(MEDIA_ROOT,'items')) 
    format = models.CharField(max_length = 255) 

私は、次の手順を実行します

テンプレート

files = File.objects.filter(item_id = id)

とパスfilesテンプレートで

私は例えばfiles.1.file.urlを使用して、まだsite.com/home/dizpers/...

のような悪いのURLを持ってUPD2

Related question

ソリューション

私の問題はfileフィールドに、ファイルのモデルにありました。 upload_toパラメータでは、私は絶対パスを使用しますが、相対パスを使用する必要があります。

file = models.FileField(upload_to = 'items')

答えて

7

私はあなたが「ダウンロードリンクを生成する」の意味を正確にわからないんだけど、とは単純に{{ some_file.url }}を使用し、ファイルにリンクあなたのhrefとしてあなたのfile_detail.html(または同等で

import os 

from django.conf import settings 
from django.db import models 

class File(models.Model): 
    ... (your existing File model) 

    @property 
    def relative_path(self): 
     return os.path.relpath(self.path, settings.MEDIA_ROOT) 

self.pathの値からMEDIA_ROOTを取り除くためにthe relpath methodを使用して)

+0

それは私のカスタムFileオブジェクトで動作しますか? djangoのFileオブジェクトではありません。 – dizpers

+0

私はそれを試しました。動作しません。それでも 'home/dizpers/...'はディスク上のファイルへのパスです。 – dizpers

+0

私はあなたの '/ home/dizpers/File'モデルはまだ標準の 'CharField'の代わりにTrue-blue' FileField'を利用していました。どちらもデータベースに同じ方法で保存されているため、実際にはそうしない理由はありません。 'FileField'はI/Oを扱うためのAPIを持っています。それでも、非常に基本的なリンクが必要な場合は、 '{{MEDIA_URL}} files/{{file_instance.path}}'を使うことができます。 –

3

models.pyでコンテンツ

4

をアップロードしたユーザーのためにhref="{{ STATIC_URL }}/files/somefile"、またはhref="{{ MEDIA_URL }}/files/somefile"を使用してみてくださいに)テンプレート:

<a href='{{ MEDIA_URL }}{{ file.relative_path }}'>{{ file.name }}</a> 

NBクリスさんの言うとおり、FileFieldを使用する方がよいでしょう。上記はあなたの状況に応じてうまくいくはずですが、あなたがそうした手配をすることを深く誓っていない限り、私は専用フィールドに変更することをお勧めします。

関連する問題