我有一个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?也许有些图书馆功能?
最后但同样重要的是:在模型中执行此操作是否良好?或者通过视图更好地完成这样的任务?
答案 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')
]
如果您使用CachedStaticFileStorage
或S3BotoStorage
(来自django-storages
),这甚至会返回正确的网址。如果你处于开发模式,这也没问题。