【问题标题】:Django Templates - how do I output the relative path of file when using a FilePathField recursivelyDjango模板-递归使用FilePathField时如何输出文件的相对路径
【发布时间】:2010-02-11 03:46:34
【问题描述】:

我有以下 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'。在管理员或模型窗体中,该选项在选择小部件中显示为'/pdf/file1.pdf'。所以显然可以按照我的要求去做。当然,额外的斜线并不重要。如果我设置recursive=False,那么我可以删除最后一个斜杠之前的路径部分。

如何获得与模型表单或管理员相同的结果?

【问题讨论】:

    标签: django django-templates


    【解决方案1】:

    下面的叶子在前导路径分隔符中,可能不是 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:]
    

    【讨论】:

    • 对于它的价值,稍微改进的答案给了我一个字符串,后面跟着几个空格。所以我不得不向它添加 .strip() 。弄清楚这一点真是令人头疼。希望这对其他人有帮助:) 所以 ... return self.icon[len(path)+1:].strip() ...
    【解决方案2】:

    这是一种作弊:

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

    未测试。

    【讨论】:

    • {{ resource.file_name.path }} 是一个空字符串,所以这不起作用。我认为这是因为在视图中 resource.file_name 是 unicode 字符串而不是 FilePathField。我一直在尝试通过 resource._meta 提取 FilePathField 的路径,但由于我对 django 还是很陌生,所以很难弄清楚。感谢您的尝试
    【解决方案3】:

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

    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 }}

    【讨论】:

      猜你喜欢
      • 2017-06-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-21
      • 1970-01-01
      • 2017-10-31
      • 2014-03-04
      • 2017-11-04
      相关资源
      最近更新 更多