Django:生成下载链接

问题描述:

我有一个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')

我不知道究竟你的“生成下载链接”的意思,而是简单地链接到的文件,只需要使用{{ 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

尝试使用href="{{ STATIC_URL }}/files/somefile",或href="{{ MEDIA_URL }}/files/somefile"用于用户上载的内容

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。上面的内容希望能够适合你的确切情况,但除非你坚持以这种方式来安排事情,否则我会建议转到专门领域。