无法使用ImageField在django中上传图像

cod*_*Joe 3 django image

我正在编写我的第一个使用ImageField的django应用程序而且我遇到了困难.问题是我的图片没有上传.我看过很多我能找到的例子.而且我不确定这里出了什么问题.

我试图通过查看upload_to目录的位置来验证我的照片是否正在上传.当表单显示在网页中时,将显示正确的上载文件按钮.当我点击提交时,下面的代码会执行,但不会上传任何图像.

基于此upload_to,我希望看到上传的图像看到下面的图像: myproject/photos或者myproject/media/photos正确吗?

我在这里做了什么明显的错误吗?如何上传我的图片?

-------------- settings.py -------------

MEDIA_ROOT = '/home/me/django_projects/myproject/media/'
MEDIA_URL = '/media/'
Run Code Online (Sandbox Code Playgroud)

-------------- 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 ...?
Run Code Online (Sandbox Code Playgroud)

-------------- forms.py -------------

class PersonForm(ModelForm):

  class Meta:
      model = Person
      fields = ( 'lastName', 'firstName', 'image' )
Run Code Online (Sandbox Code Playgroud)

FoR*_*bia 12

从django文档,我认为这可以帮助(在过去这有助于我):

首先,为了上传文件,您需要确保元素正确地将enctype定义为"multipart/form-data"

<form enctype="multipart/form-data" method="post" action="/foo/">
Run Code Online (Sandbox Code Playgroud)


小智 5

在您使用帖子数据创建表单实例的视图中,确保您已提供 request.FILES

form = PersonForm(request.POST, request.FILES)
Run Code Online (Sandbox Code Playgroud)