我正在编写我的第一个使用ImageField的django应用程序 困难。问题是我的图片没有上传。我看过了 我能找到很多例子。而且我不确定这里出了什么问题。
我正在尝试通过查看位置来验证我的照片是否正在上传
upload_to
目录。当表单显示在网页上时
显示正确的上传文件按钮。当我点击提交时,下面的代码执行,
但是没有上传任何图片。
基于upload_to
,我希望看到上传的图片可以看到以下图片之一:
myproject/photos
或myproject/media/photos
是否正确?
我在这里做了什么明显的错误吗?如何上传图片?
-------------- settings.py -------------
MEDIA_ROOT = '/home/me/django_projects/myproject/media/'
MEDIA_URL = '/media/'
-------------- model.py -------------
class Person(models.Model):
lastName = models.CharField(max_length=20)
firstName = models.CharField(max_length=20)
image = models.ImageField(upload_to='photos', blank=True, null=True)
# save executes but no image is saved.
# Because images are uploaded along with a new entry, I needed a special
# work around to get the self.id
def save(self):
for field in self._meta.fields:
if field.name == 'image':
if self.id is not None:
#save image now
field.upload_to = 'photos/%d' % self.id
else:
#Save image later
saveImageLast = True
super(Customer, self).save() # should create self.id if not already
if saveImageLast == True:
field.upload_to = 'photos/%d' % self.id
super(Customer, self).save()
print "save complete" #prints, but no image ...?
-------------- forms.py -------------
class PersonForm(ModelForm):
class Meta:
model = Person
fields = ( 'lastName', 'firstName', 'image' )
答案 0 :(得分:12)
来自django文档,我认为这可以提供帮助(过去这对我有帮助):
首先,为了上传文件,你需要确保你的文件 element正确地将enctype定义为“multipart / form-data”
<form enctype="multipart/form-data" method="post" action="/foo/">
答案 1 :(得分:4)
在您使用发布数据创建表单实例的视图中,请确保您已提供request.FILES
form = PersonForm(request.POST, request.FILES)
答案 2 :(得分:1)
这有点晚了,但'upload_to'不是一种方法。它是一个属性,表示MEDIA_ROOT的相对路径。如果要将文件保存在文件夹'photos'中,文件名为self.id,则需要在模型类的顶部创建一个函数。例如:
class Person(models.Model):
def file_path(instance):
return '/'.join(['photos', instance.id])
image = models.ImageField(upload_to=file_path)
然后当您实际保存图像时,您会调用:
person = Person(firstName='hey', lasteName='joe')
person.image.save(ImageObject.name, ImageObject)
有关图像文件对象here的更多信息。
有关upload_to here的更多信息。