Django - 如何引用静态文件的路径,我可以在模型中使用它们吗?

时间:2013-11-15 12:38:26

标签: django django-models django-staticfiles

我有一个django模型类,其中包含与每个实例相关的几个图像。 这些图像遵循某种模式,可以通过模型的名称字段来确定。

这些图像位于项目静态文件文件夹中。

所以我为我的模型类编写了一个方法来为图像生成文件路径。它在静态文件文件夹中搜索遵循模式* .jpg的所有文件(星号是必要的,因为文件名具有递增的数字)。 找到文件后,它会将绝对文件系统路径转换为通过列表传递给视图和模板的URL。

def getImages(self)
  matches[]
  for filename in fnmatch.filter(
    os.listdir(os.path.join(settings.STATIC_ROOT_DIR,'images')), self.name + '*.jpg'):
    matches.append(
      os.path.join(settings.STATIC_URL, 'images', os.path.split(filename)[1]))
  return matches

这种方法工作正常,但不会让我很满意。原因如下:

  • 对于开发模式,我需要引入一个名为STATIC_ROOT_DIR的新变量,以获取静态文件文件夹的路径。我想使用一致的方法来引用静态根文件夹进行开发和生产。我怎样才能做到这一点?我想尽可能避免开发模式hackery。

  • 我必须通过将static_url路径与其他字符串连接来构建URL,这些字符串最终将构成此静态文件的URL。有没有更好的方法来构建URL?也许有些图书馆功能?

  • 最后但同样重要的是:在模型中执行此操作是否良好?或者通过视图更好地完成这样的任务?

2 个答案:

答案 0 :(得分:3)

  • STATIC_ROOT中有一个settings.py变量。为什么不使用它?
  • 就个人而言,我按照你的方式 - 只是连接路径。但只是发现了一个功能:

    from django.contrib.staticfiles.templatetags.staticfiles import static
    print static('yourfile.jpg')
    

它对我有用。

  • 我认为模特是个好地方。您将文件存储在文件系统中,就像将数据存储在数据库中一样。换句话说,这两个都是存储的例子,它是模型级的东西。

答案 1 :(得分:2)

我想再投入一个: 如果您在外部托管文件,则使用STATIC_ROOT会中断。

您可以自己使用django-storage-backend(未经测试,只需编写):

from django.core.files.storage import get_storage_class
from django.conf import settings

def getImages(self)
    static_storage = get_storage_class(settings.STATICFILES_STORAGE)()
    directories, files = static_storage.listdir('images')
    return [
        static_storage.url('images/' + file) 
        for file in files 
        if file.startswith(self.name) and file.endswith('.jpg')
    ]

如果您使用CachedStaticFileStorageS3BotoStorage(来自django-storages),这甚至会返回正确的网址。如果你处于开发模式,这也没问题。