【问题标题】:Django: how to use upload_to property of an ImageFieldDjango:如何使用 ImageField 的 upload_to 属性
【发布时间】:2011-06-27 16:07:11
【问题描述】:

我正在编写一个带有图片上传功能的大型应用程序。

这是我的模型:

class GallryImage(models.Model):
    # ...
    image   = models.ImageField(max_length=255, upload_to='gallery', height_field='width', width_field='height')
    width   = models.IntegerField()
    height  = models.IntegerField()
    # ...

这是我处理上传的方式:

image_name = 'image.png';
destination = open(settings.MEDIA_ROOT + '/gallery/' + image_name, 'wb+')
for chunk in f.chunks():
    destination.write(chunk)
destination.close()

这段代码有点违反 DRY 原则 - 路径 gallery 重复了两次。

问题:如何重用我在模型中指定的路径 (upload_to='gallery'),这样我就不必在上传处理程序中重复?

我正在使用 python 2.6 和 Django 1.3 beta。

谢谢!

基于 Paulo 回答的解决方案

保存模型实例时,文件会自动上传,所以我要做的就是:

def add(request):
    from forms import ImageAddForm
    form = ImageAddForm()
    if request.method == 'POST':
        form = ImageAddForm(request.POST, request.FILES)
        if form.is_valid():
            image = GalleryImage(
                image   = form.cleaned_data['image']
            )
            image.save() # file is uploaded to upload_to dir!
            return HttpResponseRedirect(reverse('image_add') + '?image_added=')
    else:
        form = ImageAddForm()

    return render_to_response('gallery/add.html',
                              locals(),
                              context_instance=RequestContext(request))

【问题讨论】:

  • 为什么要手动保存图片?表单框架应该会为您解决这个问题。
  • @Paulo Scardine,如果您发布一个示例(或指向它的链接)作为答案,我将不胜感激。

标签: python django file-upload dry


【解决方案1】:

forms framework 应该会为您解决这个问题。除非您想将文件存储在文件系统以外的某个容器中,否则无需手动保存文件。

class UploadImageForm(forms.ModelForm):
    class Meta:
        model = GallryImage
...
# Sample view
def upload_file(request):
    if request.method == 'POST':
        form = UploadImageForm(request.POST, request.FILES)
        if form.is_valid():
            form.save()
            return HttpResponseRedirect('/success/url/')
    else:
        form = UploadImageForm()
    return render_to_response('upload.html', {'form': form})

【讨论】:

  • handle_uploaded_file() 是...?如果您进一步阅读文档,它是一个自定义函数,与我发布的功能相同,包括硬编码文件路径。
  • @silver light: ...剪切和粘贴错误! :-) form.save() 应该处理图像字段。
  • 谢谢!我没有将表单绑定到模型,只是保存模型本身就可以了。
猜你喜欢
  • 2011-02-08
  • 2012-01-22
  • 1970-01-01
  • 2012-06-27
  • 2011-01-15
  • 2010-12-04
  • 2012-02-23
  • 1970-01-01
  • 2015-10-11
相关资源
最近更新 更多