【问题标题】:django vanilla views create instance with imagefield using CreateViewdjango vanilla 视图使用 CreateView 创建带有 imagefield 的实例
【发布时间】:2014-08-09 23:44:03
【问题描述】:

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

但在创建时它似乎没有保存图像,可能是因为我的使用不标准。

有几件事:

  • 对于 ImageField 模型,我使用 upload_to 函数将图像保存到特定目录
  • 创建是通过一些用户不填写的信息完成的,所以我使用调度从 url 获取相关对象
  • 在保存之前,在 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)也没有成功......这是尤其是 CreateView 的默认用法......所以它可能是 upload_to 函数中的东西......(?)

【问题讨论】:

    标签: django image forms


    【解决方案1】:

    这个问题的答案比这个问题形成的更笼统:

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

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

    enctype="multipart/form-data"

    例如:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-07
      • 2018-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-18
      相关资源
      最近更新 更多