我有以下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相同的结果?
答案 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}}