Я написал эту форму, простую и не связанную с моделью или объектом формы (мне проще в этом способе стилизовать форму и контролировать ее поведение с помощью js)
<form action="{% url 'upload_music_file' %}" method="POST" id="upload-form" enctype="multipart/form-data">{% csrf_token %}
<div class="form-group">
<input type="file" class="form-control-file" id="csv-file">
</div>
<button type="submit" class="btn btn-primary">Submit</button>
</form>
и CBV, который обрабатывает почтовый запрос
class MusicFileUploadView(TemplateView):
template_name = "music_file_upload.html"
def get(self, request, *args, **kwargs):
return super().get(request, *args, **kwargs)
def post(self, request, *args, **kwargs):
print( request.FILES.keys() )
return super().get(request, *args, **kwargs)
, проблема в том, что я не вижу файл в объектах запроса
[01/May/2020 08:39:07] "GET /static/img/icon.png HTTP/1.1" 200 4822
dict_keys([])
[01/May/2020 08:39:19] "POST /upload-music-file HTTP/1.1" 200 7266
[01/May/2020 08:39:20] "GET /static/img/icon.png HTTP/1.1" 200 4822
dict_keys([])
[01/May/2020 08:39:28] "POST /upload-music-file HTTP/1.1" 200 7266
dict_keys([])
[01/May/2020 08:41:13] "POST /upload-music-file HTTP/1.1" 200 7266
[01/May/2020 08:41:13] "GET /static/js/upload_file.js?v=1.0.1 HTTP/1.1" 304 0
, есть javascript, который проверяет, существует ли файл и имеет правильный тип перед отправкой
$(document).ready(function() {
$('#upload-form').submit(function(event){
csv_file = $('#csv-file').val().endsWith('.csv')
file_exists = Boolean($('#csv-file').val())
$('#no-csv-error, #no-file-error').addClass('d-none')
if (!file_exists) {
//blank file
event.preventDefault()
$('#no-file-error').removeClass('d-none')
$(this).find('button').removeClass('btn-primary').addClass('btn-secondary')
} else if (!csv_file) {
//if not a csv file
event.preventDefault()
$('#no-csv-error').removeClass('d-none')
$(this).find('button').removeClass('btn-primary').addClass('btn-secondary')
}
})
});
, что означает, что либо форма не отправила его, либо реализация Django CBV У меня не правильный способ найти файл.