DJango FileSystem .url从错误的位置读取

时间:2018-01-31 02:10:08

标签: python django url file-system-storage

我有一个包含ImageField和FileField

的表单

文件正在上传到正确的文件夹,但是当我尝试检索要在屏幕上显示的网址时,它会给我一个错误的位置

    fs_img = FileSystemStorage(location='media/images/')
    imageName = fs_img.save(image.name,image)
    uploaded_image_url = fs_img.url(imageName)

E.G。图片上传为 media / images / profile_image.jpg 但是,当我尝试检索刚刚保存的文件的网址时,为了将位置保存到数据库,它会将其检索为 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')

另外,我发现在使用upload_to设置的models.py文件中没有效果

image = models.ImageField(
    upload_to = 'media/images/',
    default='media/no_image.png'
)

如何让fs_img.url(imageName)返回正确的URL,以便将其保存到我的数据库?

2 个答案:

答案 0 :(得分:1)

我想我修正了如下:

<强> 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 值现在正确返回

答案 1 :(得分:0)

首先检查图像是否正在保存该媒体文件夹。如果仅保存提供图像的问题,则意味着您需要在项目网址

中添加此行代码
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都会自动附加网址并提供静态数据。有关进一步参考,请使用this。如果有效,请告诉我