DJango 文件系统 .url 从错误的位置读取
DJango FileSystem .url reading from wrong location
我有一个包含 ImageField 和 FileField 的表单
文件正在上传到正确的文件夹,但是当我尝试检索 url 以在屏幕上显示时,它给了我一个错误的位置
fs_img = FileSystemStorage(location='media/images/')
imageName = fs_img.save(image.name,image)
uploaded_image_url = fs_img.url(imageName)
图片上传为 media/images/profile_image.jpg
但是,当我尝试检索刚刚保存的文件的 url 时,为了将位置保存到数据库,它会将其检索为 media/profile_image.jpg不存在
我知道 FileSystemStorage 使用的默认位置是 MEDIA_ROOT 并且这似乎正是 fs_img.url(imageName ) 正在使用
其中
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
此外,我发现在 models.py 文件中使用 upload_to 设置没有效果
image = models.ImageField(
upload_to = 'media/images/',
default='media/no_image.png'
)
如何将 fs_img.url(imageName) 转换为 return 正确的 URL 以便我可以将其保存到我的数据库中?
首先检查图像是否正在保存该媒体文件夹。如果它只保存图像服务问题意味着您需要在 Project Urls
中添加这行代码
from django.conf.urls import url, include
from django.conf import settings
from django.conf.urls.static import static
urlpatterns = [
url(r'^admin/', admin.site.urls),
]+ static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
因此,无论何时您尝试提供图像,django 都会自动附加 url 并提供静态数据。如需进一步参考,请使用 this 。让我知道这是否有效
我想我按如下方式解决了这个问题:
settings.py
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
FS_IMAGE_UPLOADS = os.path.join(MEDIA_ROOT,'images/')
FS_IMAGE_URL = os.path.join(MEDIA_URL,'images/')
FS_DOCUMENT_UPLOADS = os.path.join(MEDIA_ROOT,'documents/')
FS_DOCUMENT_URL = os.path.join(MEDIA_URL,'documents/')
views.py
image = request.FILES['image']
document = request.FILES['document']
fs_img = FileSystemStorage(
location = settings.FS_IMAGE_UPLOADS,
base_url= settings.FS_IMAGE_URL
)
imageName = fs_img.save(image.name,image)
uploaded_image_url = fs_img.url(imageName)
fs_doc = FileSystemStorage(
location = settings.FS_DOCUMENT_UPLOADS,
base_url=settings.FS_DOCUMENT_URL
)
documentName = fs_doc.save(document.name, document)
uploaded_document_url = fs_doc.url(documentName)
uploaded_image_url 和 uploaded_document_url 值现在可以正确返回
我有一个包含 ImageField 和 FileField 的表单
文件正在上传到正确的文件夹,但是当我尝试检索 url 以在屏幕上显示时,它给了我一个错误的位置
fs_img = FileSystemStorage(location='media/images/')
imageName = fs_img.save(image.name,image)
uploaded_image_url = fs_img.url(imageName)
图片上传为 media/images/profile_image.jpg 但是,当我尝试检索刚刚保存的文件的 url 时,为了将位置保存到数据库,它会将其检索为 media/profile_image.jpg不存在
我知道 FileSystemStorage 使用的默认位置是 MEDIA_ROOT 并且这似乎正是 fs_img.url(imageName ) 正在使用 其中
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
此外,我发现在 models.py 文件中使用 upload_to 设置没有效果
image = models.ImageField(
upload_to = 'media/images/',
default='media/no_image.png'
)
如何将 fs_img.url(imageName) 转换为 return 正确的 URL 以便我可以将其保存到我的数据库中?
首先检查图像是否正在保存该媒体文件夹。如果它只保存图像服务问题意味着您需要在 Project Urls
中添加这行代码from django.conf.urls import url, include
from django.conf import settings
from django.conf.urls.static import static
urlpatterns = [
url(r'^admin/', admin.site.urls),
]+ static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
因此,无论何时您尝试提供图像,django 都会自动附加 url 并提供静态数据。如需进一步参考,请使用 this 。让我知道这是否有效
我想我按如下方式解决了这个问题:
settings.py
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
FS_IMAGE_UPLOADS = os.path.join(MEDIA_ROOT,'images/')
FS_IMAGE_URL = os.path.join(MEDIA_URL,'images/')
FS_DOCUMENT_UPLOADS = os.path.join(MEDIA_ROOT,'documents/')
FS_DOCUMENT_URL = os.path.join(MEDIA_URL,'documents/')
views.py
image = request.FILES['image']
document = request.FILES['document']
fs_img = FileSystemStorage(
location = settings.FS_IMAGE_UPLOADS,
base_url= settings.FS_IMAGE_URL
)
imageName = fs_img.save(image.name,image)
uploaded_image_url = fs_img.url(imageName)
fs_doc = FileSystemStorage(
location = settings.FS_DOCUMENT_UPLOADS,
base_url=settings.FS_DOCUMENT_URL
)
documentName = fs_doc.save(document.name, document)
uploaded_document_url = fs_doc.url(documentName)
uploaded_image_url 和 uploaded_document_url 值现在可以正确返回