Django ImageField保存到位置

时间:2017-12-05 21:41:06

标签: python django

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

  

views.py“,第90行,顺序详细说明       settings.MEDIA_ROOT +'/ orders /'+ str(orderid)+'/'+ image)   TypeError:强制转换为Unicode:需要字符串或缓冲区,找到InMemoryUploadedFile

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()

2 个答案:

答案 0 :(得分:0)

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

您可能需要此处的文件名称,因此请尝试'/' + image.name

这可能会返回一些额外的路径信息,因此您必须将其删除才能获得文件名。

答案 1 :(得分:0)

经过一夜的搜索后,我找到了解决办法。我必须使用动态函数定义上传路径,然后将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)

这会将我的图像位置保存到正确的位置。