E
E
Egor2018-09-19 16:58:42
Django
Egor, 2018-09-19 16:58:42

How to accept files in Django, create an object and save the file(s) to the server?

On the Internet I found an example for uploading files. Here is the js code:

var files;


$('body').on('change','#p_upload_file', function(){
  files = this.files;
});

$('body').on('click','#p_upload_file_btn', function(){
  event.stopPropagation(); // остановка всех текущих JS событий
  event.preventDefault();  // остановка дефолтного события для текущего элемента - клик для <a> тега

  // ничего не делаем если files пустой
  if( typeof files == 'undefined' ) return;

  // создадим объект данных формы
  var data = new FormData();

  // заполняем объект данных файлами в подходящем для отправки формате
  $.each( files, function( key, value ){
    data.append( key, value );
  });

  // добавим переменную для идентификации запроса
  data.append( 'my_file_upload', 1 );

  $.ajax({
    url         : 'add_document/',
    type        : 'POST', 
    data        : {csrfmiddlewaretoken: getCookie('csrftoken'), data},
    cache       : false,
    dataType    : 'json',
    // отключаем обработку передаваемых данных, пусть передаются как есть
    //processData : false,
    // отключаем установку заголовка типа запроса. Так jQuery скажет серверу что это строковой запрос
    //contentType : false, 
    // функция успешного ответа сервера
    success     : function( respond, status, jqXHR ){

      // ОК - файлы загружены
      if( typeof respond.error === 'undefined' ){
        // выведем пути загруженных файлов в блок '.ajax-reply'
        var files_path = respond.files;
        var html = '';
        $.each( files_path, function( key, val ){
           html += val +'<br>';
        });

        $('.list-ud').html( html );
      }
      // ошибка
      else {
        console.log('ОШИБКА: ' + respond.error );
      }
    },
    // функция ошибки ответа сервера
    error: function( jqXHR, status, errorThrown ){
      alert( 'ОШИБКА AJAX запроса: ' + status, jqXHR );
    }

  });

});

Now I want to accept them in the views function:
def add_document(request):
    doc_files = request.POST.get('data')
    return HttpResponse('документ добавлен')

It seems to work, there are no errors, the download goes through. Now how do I get these files? As I understand it, several files are sent here. I need to save everything that is in the created model instance:
class Document(models.Model):
    name = models.CharField('Название документа', max_length=256)
    file = models.FileField('Файл')
    data = models.DateField('Дата', auto_now_add=True)

    class Meta:
        verbose_name = 'Документ'
        verbose_name_plural = 'Документы'

    def __str__(self):
        return self.name+'  ('+self.data+')'

Answer the question

In order to leave comments, you need to log in

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question