【问题标题】:DJango FileSystem .url reading from wrong locationDJango FileSystem .url 从错误的位置读取
【发布时间】:2018-01-31 02:10:08
【问题描述】:

我有一个包含 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) 返回正确的 URL,以便将其保存到我的数据库中?

【问题讨论】:

    标签: python django url file-system-storage


    【解决方案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_urluploaded_document_url 值现在可以正确返回

    【讨论】:

      【解决方案2】:

      首先检查图像是否保存了该媒体文件夹。如果它只保存提供图像的问题意味着您需要在 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。让我知道这是否有效

      【讨论】:

        猜你喜欢
        • 2017-04-14
        • 2016-11-03
        • 2013-04-12
        • 2015-05-03
        • 2013-10-25
        • 2013-08-12
        • 1970-01-01
        • 2022-01-22
        相关资源
        最近更新 更多