0

I am working on a project for a Django web-based application. In this project, there is a section in which I take info from the user through an HTML form. I added a section "image upload " but it gives a MultiValueDictKeyError error when the user does not upload any file. I tried this but not working for me.

This is error section : error image

This is my addpost.html section. It consists of a form through which, I am taking info.

<form action="{% url 'addpost' %}" method='POST' enctype="multipart/form-data" novalidate>
            {% include 'includes/messages.html' %}
            {% csrf_token %}
            {% if user.is_authenticated %}
            <input type="hidden" name="user_id" value="{{user.id}}">
            {% else %}
            <input type="hidden" name="user_id" value="0">
            {% endif %}
            <div class="row ">
                <div class="tex-center">
                    <div class="row">
                        <div class="col-md-6 text-left">
                            <div class="form-group name">
                                <input type="text" name="author" class="form-control" placeholder="Author"
                                    {% if user.is_authenticated %} value="{{user.first_name}}" {% endif %} readonly>
                            </div>
                        </div>
                        <div class="col-md-6">
                            <div class="form-group name">
                                <input type="text" name="title" class="form-control" placeholder="title" required>
                            </div>
                        </div>
                        <div class="col-md-6">
                            <div class="form-group name">
                                <input type="text" name="location" class="form-control" placeholder="location" required>
                            </div>
                        </div>
                        <div class="col-md-6">
                            <div class="form-group name">
                                <input type="text" name="short_desc" class="form-control"
                                    placeholder="Write short description" required>
                            </div>
                        </div>
                        <div class="col-md-12">
                            <div class="form-group message">
                                <textarea class="form-control" name="full_desc"
                                    placeholder="Write full description"></textarea>
                            </div>
                        </div>
                        <input type="file" id="myFile" name="place_photo" required/>
                        <div class="col-md-12">
                            <div class="send-btn text-center">
                                <input type="submit" class="btn btn-outline-success mr-1" value="Send Post">
                                <a href="{% url 'dashboard' %}" class="btn btn-outline-danger">Cancel</a>
                            </div>
                        </div>
                    </div>
                </div>
            </div>
        </form>

This is the views.py file where I receive POST data

def add_post(request):
    if request.method == "POST":
        try:
            is_private = request.POST['is_private']
        except MultiValueDictKeyError:
            is_private = False
        author = request.POST['author']
        title = request.POST['title']
        user_id = request.POST.get('user_id')
        location = request.POST['location']
        short_desc = request.POST['short_desc']
        full_desc = request.POST['full_desc']
        place_photo = request.FILES['place_photo']
        post = Post(author=author, user_id=user_id, title=title, location=location,
        short_desc=short_desc,full_desc=full_desc, place_photo=place_photo)
        post.save()
        messages.success(request,"Your post uploaded successfully")
    return render(request,'community/addpost.html')

This is my models.py file

class Post(models.Model):
 author = models.CharField(max_length=100, default=' ')
 title = models.CharField(max_length=150)
 user_id = models.IntegerField(blank=True)
 location = models.CharField(max_length=100, default=' ')
 short_desc = models.CharField(max_length=255, default='In less than 250 words')
 full_desc = models.TextField()
 place_photo = models.ImageField(upload_to='photos/%Y/%m/%d/')
 added_date = models.DateTimeField(default=datetime.now,blank=True)
  • `request.FILES.get('place_photo')`? Why do you not use a form class? As it is currently your implementation relies on the untrue fact that the user will always submit valid data. – Abdul Aziz Barkat May 05 '21 at 11:32
  • Yes, form class is also another way when working with forms. As I am a beginner and using this technology stack. So, getting stuck at some point. So, thanks for suggesting. It removed MultiValueDictKeyError. – Gaurav Kumar May 05 '21 at 12:11
  • Actually, I found out that I had used "novalidate" in the form, that's why it's not validating on the client-side. Later on, I fixed it too. – Gaurav Kumar May 05 '21 at 13:40

0 Answers0