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
解决方案
我的问题是在文件的模式,在file
领域。在upload_to参数我使用绝对路径,但必须使用相对路径:
file = models.FileField(upload_to = 'items')
答
我不知道究竟你的“生成下载链接”的意思,而是简单地链接到的文件,只需要使用{{ some_file.url }}
作为您的href
。
答
尝试使用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_ROOT
从self.path
的值)
在你file_detail.html
(或等效)模板:
<a href='{{ MEDIA_URL }}{{ file.relative_path }}'>{{ file.name }}</a>
NB正如Chris所说,最好在这里使用FileField
。上面的内容希望能够适合你的确切情况,但除非你坚持以这种方式来安排事情,否则我会建议转到专门领域。
它将适用于我的自定义文件对象?不是django的File对象。 – dizpers 2012-08-08 18:56:06
我试过了。不起作用。仍然可以访问site.com/home/dizpers/data/......./file.pdf其中'home/dizpers/...'是磁盘上文件的路径 – dizpers 2012-08-08 18:59:55
我假设你的' File'模型仍然使用真正的蓝色'FileField'而不是标准的'CharField'。没有理由不这样做,因为两者在数据库中的存储方式都是一样的; 'FileField'只有一个API来处理I/O。不过,如果你只需要一个非常基本的链接,你可以使用'{{MEDIA_URL}}文件/ {{file_instance.path}}'。 – 2012-08-08 19:03:10