Tengo una aplicación django donde un usuario puede cargar un archivo en el formulario de envío. Cuando se cargue el archivo, el programa obtendrá los nombres de las columnas del archivo csv y los mostrará en la plantilla de Django.
Estas son mis opiniones
def handle_new_file(request): if (request.method == 'POST'): form = NewFileForm(request.POST, request.FILES) if form.is_valid(): csv_file = request.FILES['csv_file'] fs = FileSystemStorage() file_name = fs.save(csv_file.name, csv_file) file_url = f"./media/file_uploads/{file_name}" print(file_name) print(file_url) cols = get_column_names(file_url) form.save() return HttpResponse(cols) Si bien la vista anterior se llama con éxito en el envío del formulario, no puedo pasar los datos de esta cols a la plantilla. Aquí está mi código Ajax
function upload(event) { event.preventDefault(); var data = new FormData($('form').get(0)); $.ajax({ url: $(this).attr('action'), type: $(this).attr('method'), data: data, cache: false, processData: false, contentType: false, success: function (data) { alert(data); } }); return false; } $(function () { $('#new_form').submit(upload); });¿Qué estoy haciendo mal?
Puede hacer uso de un JsonResponse [Django-doc] donde devuelve el resultado como un blob JSON:
def handle_new_file(request): if request.method == 'POST': form = NewFileForm(request.POST, request.FILES) if form.is_valid(): csv_file = request.FILES['csv_file'] fs = FileSystemStorage() file_name = fs.save(csv_file.name, csv_file) file_url = f"./media/file_uploads/{file_name}" print(file_name) print(file_url) cols = get_column_names(file_url) form.save() return JsonResponse({'cols': cols})luego, en la llamada AJAX, puede acceder al objeto con:
$.ajax({ # … success: function (data) { console.log( data.cols ); } }); Por supuesto, en realidad procesa data.cols y probablemente no registre el contenido de la lista.