views:

417

answers:

2

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 bundled dev server.

been stuck here and went through all related questions ...

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

generates

MultiValueDictKeyError: "Key 'media_file' not found 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) 

view

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

template

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

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))
czarchaic
been using it this way with no problem so far. might be a good check (if necessary) but it certainly does not solve the problem as request.FILES is still empty
PhilGo20
What do you mean 'no problems so far'? Did this work properly before?Can you post your form class?
czarchaic
What I mean is that I've been using forms with no problem, as long as I don't have to use request.FILES, without checking if the method is POST. Does tying request.POST to data in the instantiation of the class like you do could help ? I'll try that and post my form.
PhilGo20
A: 

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

PhilGo20