5

Мне нужно иметь возможность загружать несколько фото за раз. Как это сделать?

models.py

class Location(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL, default=1)
    name = models.CharField(max_length=100, verbose_name="Локация", default=u'')
    photos = models.ImageField(upload_to='photos', null=True)

forms.py

class LocationForm(forms.ModelForm):
    class Meta:
        model = Location
        fields = ['name', 'photos']

views.py

class AddLocationPageView(FormView):
    template_name = 'add_location.html'
    form_class = LocationForm

    def form_valid(self, form):
        form.save()
        return super(AddLocationPageView, self).form_valid(form)
Kromster
  • 13,809
Dennis
  • 337
  • 1
  • 4
  • 11

1 Answers1

7

При такой структуре кода никак, на сколько я понимаю. Придётся внести ряд изменений.

Во-первых, изменить модель так, чтобы она могла хранить больше одного изображения:

class Photo(models.Model):
    image = models.ImageField(upload_to='photos')
    location = models.ForeignKey(Location, related_name='photos')

class Location(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL, default=1)
    name = models.CharField(max_length=100, verbose_name="Локация", default=u'')

Во-вторых, изменить форму, чтобы она могла принимать больше одного изображения:

class LocationForm(forms.Form):
    name = forms.CharField(label=u'Локация')
    photos = forms.ImageField(label=u'Фотографии', widget=forms.FileInput(attrs={'multiple': 'multiple'}))

Наконец, усложнить алгоритм загрузки:

from django.shortcuts import render, redirect
from django.core.files.base import ContentFile

def add_location(request):
    if request.method == 'GET':
        form = LocationForm()
        return render(request, 'add_location.html', {'form': form})
    elif request.method == 'POST':
        form = LocationForm(request.POST, requst.FILES)
        if form.is_valid():
            location = Location.objects.create(user=request.user, name=form.cleaned_data['name']) 
            for f in request.FILES.getlist('photos'):
                data = f.read() #Если файл целиком умещается в памяти
                photo = Photo(location=location)
                photo.image.save(f.name, ContentFile(data))
                photo.save()
                return redirect(location) #Надо определить get_absolute_url() в модели
        else:
            return render(request, 'add_location.html', {'form': form})