Django模板 - 递归使用FilePathField时如何输出文件的相对路径

时间:2010-02-11 03:46:34

标签: django django-templates

我有以下django模型:

RESOURCE_DIR = os.path.join(settings.MEDIA_ROOT, 'resources')

class Resource(models.Model):
    title = models.CharField(max_length=255)
    file_name = models.FilePathField(path=RESOURCE_DIR, recursive=True)

我希望在模板中提供该文件的URL,以便用户可以查看或下载它。

如果我在模板中使用{{ resource.file_name }},它会在服务器上输出文件的完整路径,例如如果RESOURCE_DIR='/home/foo/site_media/media'输出'/home/foo/site_media/media/pdf/file1.pdf',而我想要的是'pdf/file1.pdf'。在admin或模型中,该选项在select小部件中显示为'/pdf/file1.pdf'。所以很明显我可以做我要求的事情。当然,额外的斜线并不重要。如果我正在设置recursive=False,那么我可以在最后一个斜线之前删除路径的一部分。

如何获得与modelform或admin相同的结果?

3 个答案:

答案 0 :(得分:1)

下面留下了前导路径分隔符,它可能不是网址需要的正斜杠

def url(self):
    path = self._meta.get_field('file_name').path
    return self.file_name.replace(path, '', 1)

如此轻微的改善

def url(self):
        path = self._meta.get_field('icon').path
        return "/" + self.icon[len(path)+1:]

答案 1 :(得分:0)

这是一种欺骗行为:

{{ resource.file_name|cut:resource.file_name.path }}

未经测试。

答案 2 :(得分:0)

我发现你可以使用resource._meta.get_field('file_name')检索FilePathField的path参数.path似乎最好在模型中执行此操作。所以模型变成了:

RESOURCE_DIR = os.path.join(settings.MEDIA_ROOT, 'resources')

class Resource(models.Model):
    title = models.CharField(max_length=255)
    file_name = models.FilePathField(path=RESOURCE_DIR, recursive=True)

    def url(self):
        path = self._meta.get_field('file_name').path
        return self.file_name.replace(path, '', 1)

然后在模板中你可以放: {{MEDIA_URL}}资源{{resource.url}}