django - modelForm 에서 request.FILES 를 받지 못할때.

2020. 4. 28. 20:25개발/시행착오

reqeust.FILES is not vaild

model.py

class Heartbeat(models.Model):
    audio_idx = models.AutoField(primary_key=True)
    user_id = models.CharField(max_length=64)
    dog_name = models.CharField(max_length=32)
    create_date = models.DateTimeField(auto_now_add=True)
    heartbeat_normal_condition = models.IntegerField(null=True)
    audio_file = models.FileField(upload_to="heartbeat_data/")

form.py (before)

class HeartBeatForm(ModelForm):
    class Meta:
        model = Heartbeat
        fields = ('user_id', 'dog_name', 'audio_file')

view.py (before)

def save_audio_file(request):
    try:
        if request.method == "POST":
            audio_data = HeartBeatForm(request.POST, request.FILES)
            if audio_data.is_valid():
                obj = audio_data.save(commit=False)
                obj.heartbeat_normal_condition = -1
                obj.save()
                return HttpResponse()
            else:
                return HttpResponseForbidden(audio_data)
        else:
            return HttpResponseNotAllowed()
    except Exception as e:
        return HttpResponseServerError(e)

위와 같은 코드에서 view.py 에 보면 audio_data = HeartBeatForm(request.POST, request.FILES) 이부분에서 자꾸 request.FILES 의 file 을 무시하고 (실제로 request.FILES 에는 파일이 잘 들어가 있음) audio_file 필드와 매핑이 안되는 오류가 있었다. django document해당 블로그 에서 나와있기로는 그냥 Form(request.POST, request.FILES) 으로 매핑하면 잘 되는데 왜이런지는 잘 모르겠지만, view.pyform.py 를 조금 수정해서 vaild 되게 하였다.

view.py (after)

def save_audio_file(request):
    try:
        if request.method == "POST":
            audio_data = HeartBeatForm(request.POST)
            if audio_data.is_valid() and request.FILES['audio_file']:
                obj = audio_data.save(commit=False)
                obj.audio_file = request.FILES['audio_file']
                obj.heartbeat_normal_condition = -1
                obj.save()
                return HttpResponse()
            else:
                return HttpResponseForbidden(audio_data)
        else:
            return HttpResponseNotAllowed()
    except Exception as e:
        return HttpResponseServerError(e)

form.py (after)

class HeartBeatForm(ModelForm):
    class Meta:
        model = Heartbeat
        fields = ('user_id', 'dog_name')

form.py 에서는 audio_file 필드를 받아주는 부분을 삭제하였고, view.py에서 request.FILES['file_name'] 으로 vaild를 체크한 다음 따로 넣어주었다.