django vanilla views使用CreateView使用imagefield创建实例

时间:2014-06-19 12:24:14

标签: django image forms

我正在使用django vanilla views(https://github.com/tomchristie/django-vanilla-views) 要编辑模型对象(Model CreateView),该模型有一个图像域。

但是在创建它似乎并不保存图像,可能是因为我不是标准用法。

这是一些事情:

  • 对于模型ImageField我使用upload_to函数将图像保存到特定目录
  • 创建是通过一些不被用户填写的信息完成的,所以我使用调度来从网址获取相关对象
  • 保存之前,在form_valid函数中,我使用form.save(commit = False)而不是在保存它之前做一些事情然后保存对象

代码:

用于upload_to

的函数
def get_image_path_albumphoto(instance, filename):
    return os.path.join('albums', slugify(str(instance.album)), filename)

模型(至少是重要的字段):

class AlbumPhoto(models.Model):
    .... some fields ...
    album = models.ForeignKey(Album, blank=False, null=False)
    image = models.ImageField(upload_to=get_image_path_albumphoto, blank=True, null=True)

创建视图:

class AlbumPhotoCreate(CreateView):
    model = AlbumPhoto
    fields=('all the other fields except the album','image')

def dispatch(self, *args, **kwargs):
    self.album = get_object_or_none(Album, id=kwargs['album_id'])
    return super(AlbumPhotoCreate, self).dispatch(*args, **kwargs)    

def get_context_data(self, **kwargs):
    kwargs['album'] = self.album
    return kwargs

def get_form(self, data=None, files=None, **kwargs):
    initial={'some_field':'gets_initialized here'}
    kwargs['initial']=initial
    return  super(AlbumPhotoCreate, self).get_form(data,files, **kwargs)

def get_success_url(self):
    if self.album:
        return 'an url using the album id with %d' % self.album.id
    return reverse_lazy('albumphoto_list')

def form_valid(self, form):
    obj = form.save(commit=False)
    obj.album=self.album
    obj.save()
    success_url= 'some url with the object id as %d' % obj.id
    return HttpResponseRedirect(success_url)  

但是图像永远不会使用此代码保存....当使用django管理员添加对象时,它可以工作,所以这是使用此CreateView的东西

更新

我试图将我的代码首先包含在字段中的相册中,删除了dispatch和form_valid函数......没有成功...最后删除了初始化...(get_form)没有成功...这是parctically默认使用CreateView ...所以它可能是upload_to函数中的东西......(?)

1 个答案:

答案 0 :(得分:2)

这个问题的答案比形成这个问题更通用:

vanilla更新视图是GenericModelView的扩展版本,所以这个问题更通用,而不是由django vanilla视图引起的。

要使用表单视图上传文件,模板中的表单标记应具有:

enctype =“multipart / form-data”

e.g:

<form method="POST" action="." enctype="multipart/form-data">