Django:如何使用ImageField的upload_to属性

3 投票
1 回答
3295 浏览
提问于 2025-04-16 11:52

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

这是我的模型:

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()

这段代码有点违反了“不要重复自己”的原则,因为路径 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))

1 个回答

5

这个 表单框架 会帮你处理这些事情。除非你想把文件存储在其他地方,不然不需要手动保存文件。

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})

撰写回答