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

Django Templates-递归使用FilePathField时,如何输出文件的相对路径,django,django-templates,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,以便用户可以查看或下

我有以下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\u name}
,它会在服务器上输出文件的完整路径,例如
resource\u DIR='/home/foo/site\u media/media'
它会输出
'/home/foo/site\u media/media/pdf/file1.pdf'
,而我想要的是
'pdf/file1.pdf'
。在admin或modelform中,该选项在select小部件中显示为
'/pdf/file1.pdf'
。所以很明显,按照我的要求去做是可能的。当然,额外的斜杠并不重要。如果我设置了
recursive=False
,那么我可以删除最后一个斜杠之前的路径部分


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

这是一种欺骗:

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

未测试。

我发现您可以使用resource检索FilePathField的path参数。_meta.get_field('file_name')。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}}resources{{resource.URL}}

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

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:]

{{resource.file_name.path}}是一个空字符串,因此这不起作用。我认为这是因为在视图resource.file_中,名称是unicode字符串,而不是FilePathField。我一直在尝试通过resource提取FilePathField的路径。\u meta但由于我对django非常陌生,所以不容易理解。感谢您尝试它的价值,稍微改进的答案给了我一个字符串,后跟几个空格。因此,我必须在其中添加.strip()。搞清楚这件事是一件令人头疼的事。希望这能帮助其他人:)所以。。。返回self.icon[len(path)+1:][.strip()。。。