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

Django-如何引用静态文件的路径,我可以在模型中使用它们吗?,django,django-models,django-staticfiles,Django,Django Models,Django Staticfiles,我有一个django模型类,其中有几个与每个实例相关的图像。 这些图像遵循特定的模式,可以由模型的名称字段确定 这些图像位于“项目静态文件”文件夹中 因此,我为我的模型类编写了一个方法来为图像生成文件路径。它在staticfiles文件夹中搜索所有遵循*.jpg模式的文件(星号是必需的,因为文件名有递增的数字)。 一旦找到一个文件,它就会将绝对文件系统路径转换为url,并通过列表传递给视图和模板 def getImages(self) matches[] for filename in

我有一个django模型类,其中有几个与每个实例相关的图像。 这些图像遵循特定的模式,可以由模型的名称字段确定

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

因此,我为我的模型类编写了一个方法来为图像生成文件路径。它在staticfiles文件夹中搜索所有遵循*.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的新变量,以获取STATIC files文件夹的路径。我想使用一种一致的方式来引用静态根文件夹进行开发和生产。我怎样才能做到这一点?我希望尽可能避免开发模式黑客

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

  • 最后但并非最不重要的一点:在模型中这样做是否是一种良好的实践?或者这样的任务最好由视图完成

      • settings.py
        中有一个
        STATIC\u ROOT
        变量。为什么不使用它呢
      • 就我个人而言,我遵循你的方式——只是连接路径。但是刚刚找到了一个函数:

        from django.contrib.staticfiles.templatetags.staticfiles import static
        print static('yourfile.jpg')
        
      它对我有用

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

        • 我想再加一个: 如果您在外部托管文件,则使用
          STATIC\u ROOT
          将中断

          您可以自己使用django存储后端(未经测试,仅编写):


          如果使用
          CachedStaticFileStorage
          S3BotoStorage
          (来自
          django存储
          ),甚至会返回正确的URL。如果您处于开发模式,这也很好

          我不喜欢在这里使用STATIC_ROOT,因为在生产中,这条路径与开发不同。目前我只使用一个设置文件进行开发和生产。我知道这不是最佳做法。您可以从
          settings.py中的
          development\u settings.py
          导入*。并使
          development\u settings.py
          仅在您的开发主机上可用。例如,将其放入VCS忽略列表中。
          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')
              ]