Django ImageField 保存到位置

Posted

技术标签:

【中文标题】Django ImageField 保存到位置【英文标题】:Django ImageField save to locations 【发布时间】:2017-12-05 21:41:06 【问题描述】:

我可以将照片上传到媒体文件夹。我的问题是我无法在上传时将它们保存到特定文件夹中。我希望根据传递到 django 视图的 id 将图像保存在一个唯一的文件夹中。以下是引发以下错误的代码:

views.py",第 90 行,按顺序详细信息 settings.MEDIA_ROOT + '/orders/' + str(orderid) + '/' + image) TypeError: coercing to Unicode: need string or buffer, InMemoryUploadedFile found

if request.method == 'POST':
    # Loop through our files in the files list uploaded
    if not os.path.exists(settings.MEDIA_ROOT + '/orders/' + str(orderid)):
        os.makedirs(settings.MEDIA_ROOT + '/orders/' + str(orderid))
    for image in request.FILES.getlist('files[]'):
        # Create a new entry in our database
        new_image = UploadedImages(client_order=client, image=image.name)
        # Save the image using the model's ImageField settings
        filename, ext = os.path.splitext(image.name)
        new_image.image.save("%s-%s%s" % (filename, datetime.datetime.now(), ext),
                             settings.MEDIA_ROOT + '/orders/' + str(orderid) + '/' + image)
        new_image.save()

如果我只使用图像,它只保存在媒体文件夹中。这是下面的代码。我知道我使用upload_to 在我的模型中设置了一个文件夹。即使这样,我也不确定如何将其设置为基于 ordierid 的文件夹。

if request.method == 'POST':
    # Loop through our files in the files list uploaded
    if not os.path.exists(settings.MEDIA_ROOT + '/orders/' + str(orderid)):
        os.makedirs(settings.MEDIA_ROOT + '/orders/' + str(orderid))
    for image in request.FILES.getlist('files[]'):
        # Create a new entry in our database
        new_image = UploadedImages(client_order=client, image=image.name)
        # Save the image using the model's ImageField settings
        filename, ext = os.path.splitext(image.name)
        new_image.image.save("%s-%s%s" % (filename, datetime.datetime.now(), ext), image)
        new_image.save()

【问题讨论】:

【参考方案1】:

经过一夜的搜索,我找到了解决办法。我必须使用动态函数定义上传路径,然后将 upload_to 设置为该函数。

def image_upload_path(instance, filename):
    return settings.MEDIA_ROOT + '/orders/0/1'.format(instance.client_order.invoice, filename)

class UploadedImages(models.Model):
    ...
    image = models.ImageField(upload_to=image_upload_path)

这修复了我的图像位置被保存到正确的位置。

【讨论】:

【参考方案2】:

您正在尝试连接字符串和文件对象'/' + image

你可能想要这里的文件名,所以试试'/' + image.name

这可能会返回一些额外的路径信息,因此您必须将其剥离以仅获取文件名。

【讨论】:

以上是关于Django ImageField 保存到位置的主要内容,如果未能解决你的问题,请参考以下文章

将通过 ajax 上传的文件保存到 Django 模型 ImageField

Django ImageField 上传图片并保存到数据库

将解码的临时图像保存到 Django Imagefield

在 Django Rest Framework 中接收 Base64 编码的图像并保存到 ImageField

ImageField() 不在 ModelForm 中保存图像 - Django/Python

Django ImageField 文件保存时处理图像(剪切,再次上传,旋转等)