2012-08-08 95 views
6

我有一個File模型,其中存儲path字段的路徑在文件系統中的文件。所有文件都存儲在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/...

UPD2

Related question

解決方案

我的問題是在文件的模式,在file領域。在upload_to參數我使用絕對路徑,但必須使用相對路徑:

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

回答

7

我不知道究竟你的「生成下載鏈接」的意思,而是簡單地鏈接到的文件,只需要使用{{ some_file.url }}作爲您的href

+0

它將適用於我的自定義文件對象?不是django的File對象。 – dizpers 2012-08-08 18:56:06

+0

我試過了。不起作用。仍然可以訪問site.com/home/dizpers/data/......./file.pdf其中'home/dizpers/...'是磁盤上文件的路徑 – dizpers 2012-08-08 18:59:55

+0

我假設你的' File'模型仍然使用真正的藍色'FileField'而不是標準的'CharField'。沒有理由不這樣做,因爲兩者在數據庫中的存儲方式都是一樣的; 'FileField'只有一個API來處理I/O。不過,如果你只需要一個非常基本的鏈接,你可以使用'{{MEDIA_URL}}文件/ {{file_instance.path}}'。 – 2012-08-08 19:03:10

3

嘗試使用href="{{ STATIC_URL }}/files/somefile",或href="{{ MEDIA_URL }}/files/somefile"用於用戶上載的內容

4

models.py

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) 

(使用the relpath method剝離MEDIA_ROOTself.path的值)

在你file_detail.html(或等效)模板:

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

NB正如Chris所說,最好在這裏使用FileField。上面的內容希望能夠適合你的確切情況,但除非你堅持以這種方式來安排事情,否則我會建議轉到專門領域。