Leeg Request.FILES met Django-uploadformulieren

Probeer een heel eenvoudig formulier te gebruiken om een ​​bestand naar een nieuwe klasse-instantie te uploaden. Ik verwacht beide bestanden in request.FILESte hebben, maar het is leeg. Ik ben op de gebundelde dev-server.

Hier vastgelopen en alle gerelateerde vragen doorgenomen.

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

genereert

MultiValueDictKeyError: “Sleutel ‘media_file’ niet gevonden in MultiValueDict:
{}>”

model

class WayfinderMap(models.Model):
    """ Way-finding Map Config"""
    media_file = models.FileField(upload_to="maps", null=True, blank=True) 
    wall_file = models.FileField(upload_to="maps_data", null=True, blank=True) 

bekijken

@login_required
def create_map(request, form_class=WayfinderMapForm, template_name="wayfinder/map/create.html"):
wayfinder_map_form = form_class(request.user, request.POST or None, request.FILES)
    if wayfinder_map_form.is_valid():
        wayfinder_map = wayfinder_map_form.save(commit=False)
        wayfinder_map.media_file = request.FILES['media_file']
        wayfinder_map.data_file = request.FILES['data_file']
        wayfinder_map.creator = request.user
        wayfinder_map.save()
    return HttpResponseRedirect(wayfinder_map.get_absolute_url())
return render_to_response(template_name, {
    "wayfinder_map_form": wayfinder_map_form,
}, context_instance=RequestContext(request))

sjabloon

<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>

Antwoord 1, autoriteit 100%

oude vraag, maar misschien vindt iemand dit nog nuttig.

Om uw <input type=file>bestanden te laten uploaden en tonen in request.FILES, MOET uw formulier enctype="multipart/form-data", bijvoorbeeld:

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

anders worden uw bestanden niet geüpload en is uw request.FILES leeg.

BTWDat is een veelvoorkomende oplossing voor een veelvoorkomende fout. Desalniettemin bevond ik me nog steeds in een situatie met lege BESTANDEN (en het bestand in de POST) terwijl al het andere er goed uitzag. Ik heb het gevoel dat het een maximale grootte was, maar ik wilde niet meer tijd besteden aan het debuggen en gebruikte gewoon request.raw_post_data. Als iemand ooit op dit probleem valt, voeg dan een opmerking toe (inclusief de precieze django-versie!) en ik zal proberen dieper te debuggen.


Antwoord 2

Het lijkt op een verzoek. FILES is in dit geval niet nodig (goed, want het is leeg …)

Ik heb deze regel aangepast

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

voor

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

en het werkt. Weet echter niet wat de juiste manier is om te doen… –


Antwoord 3

Ik weet dat dit een oude vraag is, maar het is het eerste resultaat op google voor “django request.file leeg” dus ik zou graag een mogelijke oplossing willen toevoegen na twee dagen zoeken:

Als u uw bestanden via ajax indient, moet u uw formulier verzenden via formData()in plaats van form.serialize()

zie ook hier: Django JQuery Ajax-bestand uploaden


Antwoord 4

Het probleem voor mij was dat ik het kenmerk “naam” voor de bestandsinvoer mis.


Antwoord 5

Ik ontdekte dat als je het formulier in een inhoudsblok plaatst, het lijkt te werken

   {% 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 %}

Antwoord 6

Ik denk dat uw problemen kunnen liggen bij het toewijzen van gegevens aan een formulier zonder eerst te controleren of het verzoek POST

is

@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))

Other episodes