在 django 中上传图像时"Could not derive file name from *"



我正在django和upload_to函数中构建一个图像上传模型来命名路径。但是它显示了这个错误

from django.utils import timezone
from django.contrib.auth import get_user_model
# Create your models here.

def user_directory_path(instance, filename):
return 'images/{0}/'.format(filename)

class Category(models.Model):
name = models.CharField(max_length=100)
def __str__(self):
return self.name

class Images(models.Model):
User = get_user_model()
category = models.ForeignKey(Category, on_delete=models.PROTECT, default=1)
title = models.CharField(max_length=250)
alt = models.TextField(null=True)
image = models.ImageField(
max_length=255,upload_to=user_directory_path, default='posts/default.jpg')
slug = models.SlugField(max_length=250, unique_for_date='created')
created = models.DateTimeField(default=timezone.now)
author = models.ForeignKey(
User, on_delete=models.PROTECT, related_name='author') ```   
def user_directory_path(instance, filename):
return 'images/{0}/'.format(filename)

这里你正在"转换"。将文件名转换为目录名。如果上传的文件名包含非法字符,您将得到一个错误。

尽量不要使用文件名,或者至少在返回之前删除所有可能的非法字符。

注意这个函数应该返回一个目录的路径,而不是一个文件的路径,所以你不需要文件名。

找到一个可行的解决方案

def get_file_path(instance, filename):
ext = filename.split('.')[-1]
filename = "%s.%s" % (uuid.uuid4(), ext)
return os.path.join('images/images', filename)

我相信你正在重新创建这个"学习Django DRF -构建一个图像API服务- Django Rest框架DRF - Part-1"我通过删除返回语句'images/{0}/'的第一部分得到了它的工作。这招奏效了。但随后它直接将文件保存在媒体文件夹中,而不是在media/images中,所以我从错误信息中发现,我应该在结束括号之后从'images/{0}/'中删除最后一个反斜杠,就像这样'images/{0}',它的功能应该是这样的。但我不确定这是不是正确的方法。