Django: как использовать свойство upload_to для ImageField - PullRequest
2 голосов
/ 15 февраля 2011

Я пишу большое приложение с загрузкой изображений.

Вот моя модель:

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.

Спасибо!

Решение, основанное на ответе Пауло

Когда экземпляр модели сохраняется, файл загружается автоматически, поэтому все, что мне нужно сделать, это:

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 голосов
/ 15 февраля 2011

Фреймворк форм должен позаботиться об этом за вас. Нет необходимости сохранять файлы вручную, если вы не хотите хранить их в каком-либо контейнере, кроме вашей файловой системы.

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