Reputation: 419
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
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