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 Rest Framework 中接收 Base64 编码的图像并保存到 ImageField