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