Empty Request.FILES with Django Upload forms

后端 未结 5 673
滥情空心
滥情空心 2020-12-08 02:03

Trying to use a very simple form to upload a file into a new class instance. I am expecting to have both files in request.FILES but it\'s empty. I am on the bun

相关标签:
5条回答
  • 2020-12-08 02:27

    old question, but somebody might still find this useful.

    In order to have your <input type=file> files uploaded and showns in request.FILES, your form MUST contain enctype="multipart/form-data", eg:

    <form action="" method="post" enctype="multipart/form-data">{% csrf_token %}
    {{ form.as_p }}
    <button type="submit">{% trans 'Submit' %}</button>
    </form>
    

    otherwise your files will not be uploaded and your request.FILES will be empty.

    BTW That's a common solution to a common error. Nevertheless, I still found myself in a situation with an empty FILES (and the file in the POST) when everything else was looking OK. I have the feeling it was a size limit but did not want to spend more time debugging, and just used request.raw_post_data. If ever somebody falls on this issue please add a comment (including precise django version!) and I'll try to debug more deeply.

    0 讨论(0)
  • 2020-12-08 02:37

    It seems as request.FILES is not necessary in this case (good thing cause it's empty ...)

    I modified this line

    wayfinder_map.media_file = request.FILES['media_file'] 
    

    for

    wayfinder_map.media_file = wayfinder_map_form.cleaned_data['media_file'] 
    

    and it works. Not sure what the right way to do thing though... –

    0 讨论(0)
  • 2020-12-08 02:45

    I know this is an old question, but it is the first result on google for "django request.file empty" so I would like to add a potential solution after searching for two days:

    If you submit your files through ajax, make sure to send your form via formData() instead of form.serialize()

    see also here: Django JQuery Ajax File Upload

    0 讨论(0)
  • 2020-12-08 02:46

    I found that If you put put the form in a content block then it seems to work

        {% block content %}
    <form enctype="multipart/form-data" class="uniForm" id="wayfinder_map_form" method="POST" action="">
            <fieldset class="inlineLabels">
                {{ wayfinder_map_form|as_uni_form }}
                <div class="form_block">
                    <input type="hidden" name="action" value="create" />
                    <input type="submit" value="{% trans 'create' %}"/>
                </div>
            </fieldset>
        </form>
    {% endblock %}
    
    0 讨论(0)
  • 2020-12-08 02:47

    I think your troubles may lie in assigning data to a form without first verifying the the request is POST

    @login_required
    def create_map(request, form_class=WayfinderMapForm, template_name="wayfinder/map create.html"):
      if request.method=='POST':
        wayfinder_map_form = form_class(request.user, data=request.POST, files=request.FILES)
    
        if wayfinder_map_form.is_valid():
          #save your data
          return HttpResponseRedirect(wayfinder_map.get_absolute_url())
    
      else:
        wayfinder_map_form=form_class(request.user)
    
     return render_to_response(template_name, {"wayfinder_map_form": wayfinder_map_form,}, context_instance=RequestContext(request))
    
    0 讨论(0)
提交回复
热议问题