我不完全清楚你的URL是什麼以及它們如何映射到文件路徑(並且沒有要求澄清的聲望)。所以,如果我理解錯了,請糾正我。
但與此同時,爲了稍微改寫問題,我想你說的是你在MEDIA_ROOT/folder/subfolder/numberImage_folder_subfolder.jpg
這些子文件夾中存儲了磁盤上的文件,但是當你真的想要服務的URL時,你不想在URL中的文件夾,所以該URL將有MEDIA_ROOT/numberImage_folder_subfolder.jpg
?並且只與./manage.py runserver
?
在這些假設前提下,我們有兩個步驟:將我們想要的URL映射回文件路徑,然後確保我們正在生成我們想要的URL。
對於第一,通常urls.py將有這樣的事情,以服務發展的媒體文件:
from django.conf.urls.static import static
if settings.DEBUG is True:
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
它基本上將url(r'^media/(?P<path>.*)$', django.views.static.serve)
到你的URLconf,其中serve
通吃路徑低於settings.MEDIA_URL
,並提供MEDIA_ROOT
下的等效文件。
最簡單的方法是創建一個自定義函數,該函數在同一個django.conf.urls.static
上建模,該函數在將路徑傳遞到django.views.static.serve
之前取回路徑並添加文件夾。
對於第二,如果你想從ImageField.url產生的URL從底層文件的存放路徑不同,你需要有一個自定義ImageField的子類重寫FileField.url
property(或自定義存儲類,做類似的事情)。
像這樣:
class CustomURLImageField(django.forms.fields.ImageField):
def _get_url(self):
"""
Override the standard FileField.url property to mangle the URL from
MEDIA_ROOT/folder/subfolder/numberImage.jpg
to
MEDIA_ROOT/numberImage_folder_subfolder.jpg
"""
self._require_file()
#return self.storage.url(self.name)
path_components = self.name.split('/')
folder = path_components[-3]
subfolder = path_components[-2]
numberImage, ext = os.path.splitext(path_components[-1])
return '/{numberImage}_{folder}_{subfolder}{ext}'.format(**locals())
url = property(_get_url)
這將是在生產中可能是真的太...你是如何生成你的URL)
?