Aadil Shaikh
Aadil Shaikh

Reputation: 419

Form validation not working for adding images in django 1.11

I have an app where i am uploading multiple images and uploading it. It works fine but without uploading anything if i click on upload it gives me an error because the validations are working. This is the error:

django.utils.datastructures.MultiValueDictKeyError: "'gallery'"

This is my code here:

models.py

class GalleryImage(models.Model):

    image = models.ImageField(upload_to='uploads/obituaries', db_index=True)
    obituary = models.ForeignKey(Obituary, related_name="gallery")

    def __str__(self):
        return self.obituary.name

Views.py

class GalleryAddView(View):
    def post(self, request, slug):
        try:
            data = request.FILES['gallery']
            if len(request.FILES.getlist('gallery')) > 10:
                messages.error(request, "Max gallery images limit exceeded! Only 10 images are allowed.")
                return HttpResponseRedirect(
                    reverse('obituary:public', kwargs={'slug': slug}))
            if request.FILES['gallery']:
                for f in self.request.FILES.getlist('gallery'):
                    print(f)
            instance1 = Obituary.objects.get(slug=slug)

            if self.request.FILES:
                for f in self.request.FILES.getlist('gallery'):
                    GalleryImage.objects.create(obituary=instance1, image=f)
            messages.success(request, "Gallery images uploaded successfully!")
            else:
                messages.error(request, 'Please upload some images')

        except Obituary.DoesNotExist:
            messages.error(request, constants.OPERATION_UNSUCCESSFUL)
        return HttpResponseRedirect(reverse('obituary:public', kwargs={'slug': slug}))

forms.py

class GalleryForm(models.ModelForm):

    class Meta:
        model = GalleryImage
        fields = ['image']

template.html

<form class="setting-form" id="create_obit" action="{% url 'obituary:gallery' obituary.slug %}" method="POST" enctype="multipart/form-data">
    {% csrf_token %}
    <fieldset>
         <div class="col-xs-12">
         {% if gallery|length > 0 %}
                 <h3>Upload More Gallery Photos</h3>
         {% else %}
                 <h3>Upload Gallery Photos</h3>
         {% endif %}
         <div class="dropzone" id="my-awesome-dropzone">
               <div class="fallback">
                    (Maximum image size should be 8 MB)
                       <input type="file" name="gallery" class="form-control input-field" id="id_user_image" accept="image/*" multiple>
              </div>
         </div>
      </div>
         <div class="col-xs-12">
             <div class="form-group">
                  <button type="submit" id="create" class="btn send-btn" >Upload</button>
             </div>
        </div>
</fieldset>
</form>

I dont know where i am going wrong.

Upvotes: 0

Views: 46

Answers (1)

pomo_mondreganto
pomo_mondreganto

Reputation: 2074

I believe the error is in this line:

data = request.FILES['gallery']

As you don't send files, request.FILES is empty and therefore raises exception on direct access.

Possible solution would be to check first is request.FILES has the key 'gallery', and don't do the checks otherwise, look at the following code:

 def post(self, request, slug):
        try:
            if request.FILES.get('gallery'):
                data = request.FILES['gallery']
                if len(request.FILES.getlist('gallery')) > 10:
                    messages.error(request, "Max gallery images limit exceeded! Only 10 images are allowed.")
                    return HttpResponseRedirect(
                    reverse('obituary:public', kwargs={'slug': slug}))
                if request.FILES['gallery']:
                    for f in self.request.FILES.getlist('gallery'):
                        print(f)

            instance1 = Obituary.objects.get(slug=slug)
            form = GalleryForm(request.POST, request.FILES)
            if form.is_valid():
                if self.request.FILES:
                    for f in self.request.FILES.getlist('gallery'):
                        GalleryImage.objects.create(obituary=instance1, image=f)
                messages.success(request, "Gallery images uploaded successfully!")
            else:
                messages.error(request, 'Please upload some images')

        except Obituary.DoesNotExist:
            messages.error(request, constants.OPERATION_UNSUCCESSFUL)
        return HttpResponseRedirect(reverse('obituary:public', kwargs={'slug': slug}))

Upvotes: 2

Related Questions