Как загрузить файл в Django? [закрыто]

Как новичок в Django, мне трудно создать приложение для загрузки в Django 1.3. Я не смог найти актуальных примеров/фрагментов. Может ли кто-нибудь опубликовать минимальный, но полный пример кода (модель, представление, шаблон) для этого?


Фу, в документации Django действительно нет хорошего примера по этому поводу. Я потратил более 2 часов, чтобы раскопать все части, чтобы понять, как это работает. Обладая этими знаниями, я реализовал проект, который позволяет загружать файлы и отображать их в виде списка. Чтобы загрузить исходный код проекта, посетите https://github.com/axelpale/minimal-django-file-upload-example или клонируйте его:

 > git clone https: //github.com/axelpale/minimal-django-file-upload-example.git

Источник на GitHub также есть реализация для Django 1.4 в дополнение к 1.3. Несмотря на то, что есть несколько изменений, следующее руководство также полезно для 1.4.

Обновление 2013-05-10: Реализация для Django 1.5 на GitHub. Незначительные изменения в перенаправлении в urls.py и использовании тега шаблона url в list.html. Спасибо hubert3 за усилия.

Обновление 2013-12-07: Django 1.6 поддерживается на GitHub. Один импорт изменен в myapp/urls.py. Спасибо Arthedian.

Обновление 2015-03-17: Django 1.7 поддерживается на GitHub благодаря aronysidoro.

Обновление от 04.09.2015: Django 1.8 поддерживается на GitHub благодаря nerogit.

Обновление от 03.07.2016: Django 1.9 поддерживается на GitHub благодаря daavve и nerogit

Дерево проекта

Базовый проект Django 1.3 с одним приложением и медиа/каталогом для загрузки.

  минимальный-django-file-upload-example/src/myproject/database/sqlite.db media/myapp/templates/myapp/list.html forms.py models.py  urls.py views.py __init__.py manage.py settings.py urls.py  

1. Настройки: myproject/settings.py

Чтобы загружать и обслуживать файлы, вам необходимо указать, где Django хранит загруженные файлы и с какого URL-адреса Django их обслуживает. MEDIA_ROOT и MEDIA_URL по умолчанию находятся в settings.py, но они пусты. См. Первые строки в Django Managing Files для подробностей. Не забудьте также установить базу данных и добавить myapp в INSTALLED_APPS

  ... import osBASE_DIR = os.path.dirname (os.path.dirname (__ file __)) ... DATABASES =  {'default': {'ENGINE': 'django.db.backends.sqlite3', 'NAME': os.path.join (BASE_DIR, 'database.sqlite3'), 'USER': '', 'PASSWORD':  '', 'HOST': '', 'PORT': '',}} ... MEDIA_ROOT = os.path.join (BASE_DIR, 'media') MEDIA_URL = '/media/'...INSTALLED_APPS = (.  .. 'myapp',)  

2. Модель: myproject/myapp/models.py

Далее вам понадобится модель с FileField. В этом конкретном поле хранятся файлы, например в media/documents/2011/12/24/на основе текущей даты и MEDIA_ROOT. См. Справку по FileField.

  # - * - coding: utf-8 - * - из django.db import modelsclass Document (models.Model): docfile = models.FileField (upload_to  = 'документы/% Y/% m/% d')  

3. Форма: myproject/myapp/forms.py

Чтобы правильно обрабатывать загрузку, вам нужна форма. В этой форме есть только одно поле, но этого достаточно. Подробности см. В справке по Form FileField.

  # - * - coding: utf-8 - * - из django import formsclass DocumentForm (forms.Form): docfile = forms.FileField (  label = 'Выберите файл', help_text = 'max. 42 мегабайта')  

4. Представление: myproject/myapp/views.py

Представление, в котором происходит вся магия. Обратите внимание, как обрабатываются request.FILES . Для меня было действительно трудно заметить тот факт, что request.FILES ['docfile'] можно просто так сохранить в models.FileField. Функция save () модели автоматически обрабатывает сохранение файла в файловой системе.

  # - * - coding: utf-8 - * - from django.shortcuts import render_to_responsefrom django.  шаблон import RequestContextfrom django.http import HttpResponseRedirectfrom django.core.urlresolvers import reversefrom myproject.myapp.models import Documentfrom myproject.myapp.forms import DocumentFormdef list (request): # Обработка загрузки файла, если request.method form == 'POST':  DocumentForm (request.POST, request.FILES) if form.is_valid (): newdoc = Document (docfile = request.FILES ['docfile']) newdoc.save () # Перенаправить на список документов после POST return HttpResponseRedirect (reverse (  'myapp.views.list')) else: form = DocumentForm () # Пустая, несвязанная форма # Загрузить документы для страницы списка documents = Document.objects.all () # Отрендерить страницу списка с документами и формой return render_to_response  ('myapp/list.html', {'документы': документы, 'форма': форма}, context_instance = RequestContext (запрос)) код> 

5. URL-адреса проектов: myproject/urls.py

Django по умолчанию не обслуживает MEDIA_ROOT. Это было бы опасно в производственной среде. Но на стадии разработки мы могли прервать работу. Обратите внимание на последнюю строчку. Эта строка позволяет Django обслуживать файлы из MEDIA_URL. Это работает только на стадии разработки.

Подробности см. В справке по django.conf.urls.static.static. См. Также это обсуждение обслуживания файлов мультимедиа.

  # - * - coding: utf-8 - * - из django.conf. Шаблоны импорта. Urls, include, urlfrom django.conf  импортировать настройки из django.conf.urls.static import staticurlpatterns = patterns ('', (r '^', include ('myapp.urls')),) + static (settings.MEDIA_URL, document_root = settings.MEDIA_ROOT)  

6. URL-адреса приложений: myproject/myapp/urls.py

Чтобы сделать представление доступным, вы должны указать для него URL-адреса. Ничего особенного.

  # - * - coding: utf-8 - * - from django.conf.urls import patterns, urlurlpatterns = patterns ('myapp. views ', url (r' ^ list/$ ',' list ', name =' list '),)  

7. Шаблон: myproject/myapp/templates/myapp/list.html

Последняя часть: шаблон для списка и форма загрузки под ним. Форма должна иметь атрибут enctype, установленный на «multipart/form-data», и метод, установленный на «post», чтобы сделать загрузку в Django возможной. Подробнее см. Документацию по загрузке файлов.

FileField имеет много атрибутов, которые можно использовать в шаблонах. Например. {{document.docfile.url}} и {{document.docfile.name}}, как в шаблоне. Подробнее об этом см. В статье Использование файлов в моделях и в документации к объекту File.

       Пример минимальной загрузки файла Django     {% if documents%}  {% else%} 

Нет документов.

{% endif%} {% csrf_token%}

{{form.non_field_errors}}

{{form.docfile.label_tag}} {{form.docfile.help_text}}

{{form.docfile.errors}} {{form.docfile}}

8. Инициализировать

Просто запустите syncdb и runserver.

 > cd myproject> python manage.py syncdb> python manage.py runserver  

Результаты

Наконец, все готово. В среде разработки Django по умолчанию список загруженных документов можно увидеть по адресу localhost: 8000/list/. Сегодня файлы загружены в/path/to/myproject/media/documents/2011/12/17/и могут быть открыты из списка.

Я надеюсь, что этот ответ поможет кому-то настолько же, насколько это помогло бы мне.


78

Обычно говоря, когда вы пытаетесь «получить рабочий пример», лучше всего «просто начать писать код». Здесь нет кода, который мог бы помочь вам, поэтому ответ на вопрос становится для нас намного труднее..

Если вы хотите получить файл, вам понадобится что-то вроде этого где-нибудь в html-файле:

        

Это даст вам кнопку просмотра, кнопку загрузки, чтобы начать действие (отправить форму) и отметить enctype, чтобы Django знал, что нужно предоставить вам request.FILES

Где-нибудь в представлении вы можете получить доступ к файлу с помощью

  def myview (request): request.FILES ['myfile'] # this  это мой файл  

В документации по загрузке файлов содержится огромное количество информации

Я рекомендую вам внимательно прочитать эту страницу и просто начните писать код - затем возвращайтесь с примерами и трассировкой стека, когда он не работает.

Поделиться
Улучшить этот ответ
ответ дан 3 май '11 в 18: 25
  • 10
    Спасибо, Генри. На самом деле я прочитал документы и написал некоторый код, но поскольку в документах есть некоторые пробелы (например, «откуда-то импортировать handle_uploaded_file») и мой код был некорректным, я подумал, что было бы намного лучше, если бы я мог начать с рабочего примера . - qliq 3 мая 2011 г., 15:32
  • 28
    Согласен с qliq. Простой рабочий пример - самый эффективный способ заинтересовать новичков, а не документацию - Philip007, 29 окт., 12:42
  • 12
    enctype = "multipart/form-data" , что мне нужно для работы, спасибо ! - john-charles, 09 янв. '13 в 20:25
  • 5
    Только не пропустите {% csrf_token%} в тегах формы. - jonincanada 15 нояб., 22:28
  • можно ли это сделать БЕЗ ФОРМ ИЗ FORMS.PY? - Роэль 08 сен 2016, в 17:26
| показать 1 дополнительный комментарий

Вообще говоря, когда вы пытаетесь «просто получить рабочий пример», это лучше всего «просто начать писать код». Здесь нет кода, который мог бы помочь вам, поэтому ответ на вопрос становится для нас намного труднее..

Если вы хотите получить файл, вам понадобится что-то вроде этого где-нибудь в html-файле:

        

Это даст вам кнопку просмотра, кнопку загрузки, чтобы начать действие (отправить форму) и отметить enctype, чтобы Django знал, что нужно предоставить вам request.FILES

Где-нибудь в представлении вы можете получить доступ к файлу с помощью

  def myview (request): request.FILES ['myfile'] # this  это мой файл  

В документации по загрузке файлов содержится огромное количество информации

Я рекомендую вам внимательно прочитать эту страницу и просто начните писать код - затем возвращайтесь с примерами и трассировкой стека, когда он не работает.


76

Демо

См. репутацию на github o, работает с Django 3

1. Создайте проект django

Запустите startproject ::

  $ django-admin.py пример startproject  

теперь папка ( sample ) создана.

2. создать приложение

Создать приложение ::

  $ cd sample $ python manage.py startapp uploader  

Теперь создается папка ( загрузчик ) с этими файлами ::

  uploader/__init__.py admin.py app.  py models.py tests.py views.py migrations/__init__.py  

3. Обновите settings.py

В sample/settings.py добавьте 'uploader' в INSTALLED_APPS и добавьте MEDIA_ROOT и MEDIA_URL , т.е. ::

  INSTALLED_APPS = ['uploader',  ...  ...] MEDIA_ROOT = os.path.join (BASE_DIR, 'media') MEDIA_URL = '/media/'  

4. Обновите urls.py

в sample/urls.py add ::

  ...  ... from django.conf import settingsfrom django.conf.urls.static import staticfrom uploader import views as uploader_viewsurlpatterns = [...  ... path ('', uploader_views.UploadView.as_view ()  , name = 'fileupload'),] + static (settings.MEDIA_URL, document_root = settings.MEDIA_ROOT)  

5. Обновите models.py

update uploader/models.py ::

  из django.db import modelsclass  Загрузить (models.Model): upload_file = models.FileField () upload_date = models.DateTimeField (auto_now_add = True)  

6. Обновите views.py

update uploader/views.py ::

  из django.views.generic  .edit import CreateViewfrom django.urls import reverse_lazyfrom. models import Uploadclass UploadView (CreateView): model = Upload fields = ['upload_file',] success_url = reverse_lazy ('fileupload') def get_context_data (self, ** kwargs): context = super (). get_context_data (** kwargs) context  ['documents'] = Upload.objects.all () возвращает контекст  

7. создавать шаблоны

Создайте папку

Создайте файл upload_form.html т.е. sample/uploader/templates/uploader/upload_form.html ::

  

Загрузка файла Django

{% csrf_token%} {{form.as_p} }
    {% для документа в документах%}
  • {{document.upload_file.name}} ({{document.upload_file.size | sizesformat}}) - {{document.upload_date}}
  • {% endfor% }

8. Синхронизировать базу данных

Синхронизировать базу данных и сервер запуска ::

  $ python manage.py makemigrations $ python manage.py migrate $ python manage.py runserver  

посетите http://localhost: 8000/

Поделиться
Улучшить этот ответ
отредактировано 20 апреля '20 в 17:02
ответил 5 июня '14 в 17:10
  • 2
    идеально, за исключением последней строки - должно быть localhost.com:8000/upload> Это работало для django 1.6 и Python 3.3. - Стив 10 июня '14 в 15:02
  • 5
    +1 для шаблона проектирования многоразового приложения django - Марсель 17 июня 2014 г., 15:22
  • 1
    Аксели использовал FileField , а suhail использовал ImageField , не могли бы вы объяснить варианты выбора? - davidtgq, 15 ноя. 2015, в 20:06
  • @dtgq Я обновил ответ, чтобы использовать его с FileField . ImageField необходимо для загрузки только изображений. обновление будет работать с Django 1.11. - suhailvs 11 авг. '17 в 16:11
  • протестировано на Django 2. 0 и работал отлично - diek 01 апр. '18 в 21:41
добавить комментарий |

Демо

См. репозиторий github, работает с Django 3

1. Создайте проект django

Запустите startproject ::

  $ django-admin.py пример startproject  

теперь папка ( sample ) создана.

2. создать приложение

Создать приложение ::

  $ cd sample $ python manage.py startapp uploader  

Теперь создается папка ( загрузчик ) с этими файлами ::

  uploader/__init__.py admin.py app.  py models.py tests.py views.py migrations/__init__.py  

3. Обновите settings.py

В sample/settings.py добавьте 'uploader' в INSTALLED_APPS и добавьте MEDIA_ROOT и MEDIA_URL , т.е. ::

  INSTALLED_APPS = ['uploader',  ...  ...] MEDIA_ROOT = os.path.join (BASE_DIR, 'media') MEDIA_URL = '/media/'  

4. Обновите urls.py

в sample/urls.py add ::

  ...  ... from django.conf import settingsfrom django.conf.urls.static import staticfrom uploader import views as uploader_viewsurlpatterns = [...  ... path ('', uploader_views.UploadView.as_view ()  , name = 'fileupload'),] + static (settings.MEDIA_URL, document_root = settings.MEDIA_ROOT)  

5. Обновите models.py

update uploader/models.py ::

  из django.db import modelsclass  Загрузить (models.Model): upload_file = models.FileField () upload_date = models.DateTimeField (auto_now_add = True)  

6. Обновите views.py

update uploader/views.py ::

  из django.views.generic  .edit import CreateViewfrom django.urls import reverse_lazyfrom .models import Uploadclass UploadView (CreateView): model = Upload fields = ['upload_file',] success_url = reverse_lazy ('fileupload') def get_context_data (self, ** kwargs): context = super  () .get_context_data (** kwargs) context ['documents'] = Upload.objects.all () return context  

7. создавать шаблоны

Создайте папку

Создайте файл upload_form.html т.е. sample/uploader/templates/uploader/upload_form.html ::

  

Загрузка файла Django

{% csrf_token%} {{form.as_p} }
    {% для документа в документах%}
  • {{document.upload_file. name}} ({{document.upload_file.size | sizesformat}}) - {{document.upload_date}}
  • {% endfor%}

8. Синхронизировать базу данных

Синхронизировать базу данных и сервер запуска ::

  $ python manage.py makemigrations $ python manage.py migrate $ python manage.py runserver  

посетите http://localhost: 8000/


29

Я должен сказать, что нахожу документацию на django запутанной. Также для простейшего примера, почему упоминаются формы? Пример, который мне пришлось работать в views.py: -

  для ключа, файл в запросе.FILES.items (): path = file.name dest = open (path, 'w') if file.multiple_chunks: for c in  file.chunks (): dest.write (c) else: dest.write (file.read ()) dest.close ()  

Файл html выглядит как код ниже , хотя в этом примере загружается только один файл, а код для сохранения файлов обрабатывает многие: -

   {% csrf_token%}   

Эти примеры не являются моим кодом, они были взяты из двух других примеров, которые я нашел. Я относительно новичок в django, поэтому очень вероятно, что я отсутствует ключевой момент.

Поделиться
Улучшите этот ответ
отредактировал 7 апреля 2013 в 20:28
Ray
1,4871212 серебряных знаков1616 бронзовых знаков
7 июня '12 в 15: 11
  • 3
    +1 за неиспользование FileField и model.Form . Для новичков (и для тривиальных задач) ручная обработка загруженных файлов, как показано выше, не вызывает затруднений. - AneesAhmed777, 25 августа 2017, 18:42
  • dest = open (path, 'wb') при записи файла байтами - Бипул Рой, 9 марта 2020 г., в 19:29
добавить комментарий |

Я должен сказать, что нахожу документацию на django запутанной. Также для простейшего примера, почему упоминаются формы? Пример, который я должен был работать в views.py: -

  для ключа, файл в request.FILES.items (): path = file.name dest = open (path, 'w')  если file.multiple_chunks: для c в файле. chunks (): dest.write (c) else: dest.write (file.read ()) dest.close ()  

Хотя файл html выглядит так, как показано ниже, в этом примере загружается только один файл, а код для сохранения файлов обрабатывает многие: -

   {% csrf_token%}   

Эти примеры не являются моим кодом, они взяты из двух других примеров, которые я нашел . Я относительный новичок в django, поэтому очень вероятно, что я упустил какой-то ключевой момент.


22

У меня тоже было подобное требование. Большинство примеров в сети просят создавать модели и формы, которые я не хотел использовать. Вот мой последний код.

  if request.method == 'POST': file1 = request.FILES ['file'] contentOfFile = file1.read () if file1:  return render (request, 'blogapp/Statistics.html', {'file': file1, 'contentOfFile': contentOfFile})  

И в HTML для загрузки я написал:

  {% block content%} 

Содержимое файла

{% csrf_token%} {% endblock%}

Ниже приведен HTML-код, отображающий содержимое файла:

  {% block content%} 

Файл успешно загружен

{{file.name}} content = {{contentOfFile}} {% endblock%}

Поделиться
Улучшите этот ответ
a n 10 нояб. '14 в 02:16
  • хорошо потому что иногда просто хочется использовать содержимое файла, а не сохранять загрузку ... - nemesisfixx 21 дек. '16 в 0:37
добавить комментарий |

У меня тоже было подобное требование. Большинство примеров в сети просят создавать модели и формы, которые я не хотел использовать. Вот мой последний код.

  if request.method == 'POST': file1 = request.FILES ['file'] contentOfFile = file1.read () if file1:  возврат рендера (запрос, 'blogapp/Statistics. html ', {' file ': file1,' contentOfFile ': contentOfFile})  

И в HTML для загрузки я написал:

  {% block content%} 

Содержание файла

{% csrf_token%} {% endblock%}

Ниже приведен HTML-код, отображающий содержимое файла:

  {% block content%}  

Файл успешно загружен

{{file.name}} content = {{contentOfFile}} {% endblock%}

17

Расширение на примере Генри:

  import  tempfileimport shutilFILE_UPLOAD_DIR = '/home/imran/uploads'def handle_uploaded_file (источник): fd, filepath = tempfile.mkstemp (prefix = source.name, dir = FILE_UPLOAD_  DIR) с open (filepath, 'wb') как dest: shutil.copyfileobj (source, dest) return filepath  

Вы можете вызвать этот handle_uploaded_file функция из вашего представления с загруженным файловым объектом. Это сохранит файл с уникальным именем (с префиксом имени исходного загруженного файла) в файловой системе и вернет полный путь к сохраненному файлу. Вы можете сохранить путь в базе данных и сделать что-нибудь с файлом позже.

Поделиться
Улучшить этот ответ
отредактировано 23 мая '17 в 11:47
Сообщество ♦
111 серебряный значок
ответил 3 мая '11 в 15 : 42
  • Имран, я пробовал ваш код на моем view, но получил эту ошибку: объект WSGIRequest не имеет атрибута name. - qliq 3 мая 2011 г., 16:14
  • 2
    Передайте загруженный файловый объект ( request.FILES ['myfile'] ) в handle_uploaded_file , а не в запрос сам. - Имран 3 мая 2011 г., 16:23
  • Могу ли я сохранить его прямо в базе данных? stackoverflow.com/questions/24705246/… - AlexandruC 12 июля '14 в 13:41
  • Используя prefix = source.name , он добавил дополнительные символы в конец файла, что нарушило расширение файла. Например. upload.csv изменен на upload. csv5334 . Изменив его на suffix = source.name , я исправил это. - Тарим Икбал, 15 авг. '16 в 07:46
добавить комментарий |

Расширение на примере Генри:

  import tempfileimport shutilFILE_UPLOAD_DIR = '/home/imran /uploads'def handle_uploaded_file (source): fd, filepath = tempfile.mkstemp (prefix = source.name, dir = FILE_UPLOAD_DIR) с open (filepath, 'wb') как dest: shutil.copyfileobj (source, dest) return filepath  

Эту функцию handle_uploaded_file можно вызвать из представления с помощью загруженного файлового объекта. Это сохранит файл с уникальным именем (с префиксом имени исходного загруженного файла) в файловой системе и вернет полный путь к сохраненному файлу. Вы можете сохранить путь в базе данных и сделать что-нибудь с файлом позже.


13

Здесь вам может помочь: создать поле файла в вашем models.py

Для загрузки файла (в вашем admin.py):

  def save_model (self, request, obj, form, change): url = "http://img.youtube.com/vi/%s/hqdefault.jpg"% (obj.video  ) url = str (url), если url: temp_img = NamedTemporaryFile (delete = True) temp_img.write (urllib2.urlopen (url) .read ()) temp_img.flush () filename_img = urlparse (url) .path.split (' /') [- 1] obj.image.save (filename_img, File (temp_img)  

и также используйте это поле в своем шаблоне.

Поделиться
Улучшить этот ответ
отредактировано 25 января '17 в 04:40

v>

ответил 20 октября 2013 в 10:39
  • 1
    Это полезно, когда вам нужно вручную добавить файлы, которые вы хотите сохранить. В таком случае вам также может понадобиться этот раздел: docs.djangoproject.com/en/dev/topics/files/#the-file-object - kecske 17 июля 2014 г., 22:25
  • это очень полезно, и это работает. У меня вопрос: как django связал представление с файлом upload_form.html? Я не вижу, чтобы к ним присоединились ... - Эскачатор 20 авг., 20:48
  • понял ... объяснил здесь: docs.djangoproject.com/en/3.1/ref/class-based-views/… - Escachator 20 августа '20 в 20:55
добавить комментарий |

Здесь вам может помочь: создать поле файла в вашем models.py

Для загрузки файла (в вашем админке. py):

  def save_model (self, request, obj, form, change): url = "http://img.youtube.com/vi/%s/hqdefault  .jpg "% (obj.video) url = str (url) if url: temp_img = NamedTemporaryFile (delete = True) temp_img.write (urllib2.urlopen (url) .read ()) temp_img.flush () filename_img = urlparse (  url) .path.split ('/') [- 1] obj.image.save (filename_img, File (temp_img)  

и также используйте это поле в своем шаблоне.


11

Вы можете обратиться к примерам серверов в Fine Загрузчик с версией django. Https://github.com/FineUploader/server-examples/tree/master/python/django-fine-uploader

Это очень элегантно и, самое главное, он предоставляет избранную библиотеку js. Шаблон не включен в примеры серверов, но вы можете найти демонстрацию на его веб-сайте. Fine Uploader: http://fineuploader.com/demos.html

django-fine -загрузчик

views.py rong>

UploadView отправляет запрос на публикацию и удаление соответствующим обработчикам.

  class UploadView (View): @csrf_exempt def dispatch (self, * args, ** kwargs): return super (UploadView, self) .dispatch (* args, **)  kwargs) def post (self, request, * args, ** kwargs): "" "Запрос POST. Подтвердите форму и затем обработайте загрузку на основе POST-данных. Пока не обрабатывает дополнительные параметры." "" form =  UploadFileForm (request.POST, request.FILES), если form.is_valid (): handle_upload (request.FILES ['qqfile'], form.cleaned_data) return make_response (content = json.dumps ({'success': True}))  else: return make_response (status = 400, content = json.dumps ({'success': False, 'error': '% s'% repr (form.errors)})) def delete (self, request, * args,  ** kwargs): "" "Запрос DELETE. Если найден, удаляет файл с соответствующим UUID из файловой системы сервера." "" qquuid = kwargs.get ('qquuid', '') if qquuid: try: handle_deleted_file (  qquuid) return make_response (content = json.dumps ({'success': True})) except Exception, e: return make_response (status = 400, content = json.dumps ({'  success ': False,' error ':'% s '% repr (e)})) return make_response (status = 404, content = json.dumps ({' success ': False,' error ':' Файл отсутствует '  }))  

forms.py

  класс UploadFileForm (forms.Form):  "" "Эта форма представляет собой простой запрос от Fine Uploader.  Обязательные поля будут ** всегда ** отправляться, остальные поля являются необязательными в зависимости от ваших настроек.  Измените это, если вы хотите добавить пользовательские параметры в тело запроса POST.  "" "qqfile = forms.FileField () qquuid = forms.CharField () qqfilename = forms.CharField () qqpartindex = forms.IntegerField (required = False) qqchunksize = forms.IntegerField (required = False) qqpartbyteoffset = forms. IntegerField (required = False) qqtotalfilesize = forms.IntegerField (required = False) qqtotalparts = forms.IntegerField (required = False)  

Поделиться
Улучшить этот ответ
отредактировано 30 ноября 2015 г. в 13:02
Gaurav Jain
1,32711 золотых знаков1818 серебряных знаков2828 бронзовых знаков
ответил 7 апр. 2015 в 16:35
добавить комментарий |

Вы можете обратиться к примерам серверов в Fine Uploader с версией django. https://github.com/FineUploader/server-examples /tree/master/python/django-fine-uploader

Это очень элегантно и, что самое важное, предоставляет возможности js lib. Шаблон не включен в серверные примеры, но вы можете найти демонстрацию на его веб-сайте. Fine Uploader: http://fineuploader.com/demos.html

django-fine-uploader

UploadView отправляет запрос публикации и удаления соответствующим обработчикам.

  class UploadView (View): @csrf_exempt def dispatch (self, * args, ** kwargs): return super (UploadView, self) .dispatch (* args, **)  kwargs) def post (self, request, * args, ** kwargs): "" "Запрос POST. Подтвердите форму и затем обработайте загрузку на основе POST-данных. Пока не обрабатывает дополнительные параметры." "" form =  UploadFileForm (request.POST, request.FILES), если form.is_valid (): handle_upload (request.FILES ['qqfile'], form.cleaned_data) return make_response (content = json.dumps ({'success': True}))  else: return make_response (status = 400, content = json.dumps ({'success': False, 'error': '% s'% repr (form.errors)})) def delete (self, request, * args,  ** kwargs): "" "Запрос DELETE. Если найден, удаляет файл с соответствующим UUID из файловой системы сервера." "" qquuid = kwargs.get ('qquuid', '') if qquuid: try: handle_deleted_file (  qquuid) return make_response (content = json.dumps ({'success': True})) except Exception, e: return make_response (status = 400, content = json.dumps ({'  success ': False,' error ':'% s '% repr (e)})) return make_response (status = 404, content = json.dumps ({' success ': False,' error ':' Файл отсутствует '  }))  

формы. py

  class UploadFileForm (forms.Form): "" "Эта форма представляет собой базовый запрос от Fine Uploader. Обязательные поля ** всегда ** будут  отправлено, остальные поля являются необязательными в зависимости от ваших настроек. Измените это, если вы хотите добавить пользовательские параметры в тело запроса POST. "" "qqfile = forms.FileField () qquuid = forms.CharField () qqfilename = forms.  CharField () qqpartindex = forms.IntegerField (required = False) qqchunksize = forms.IntegerField (required = False) qqpartbyteoffset = forms.IntegerField (required = False) qqtotalfilesize = forms.IntegerField (required = False) qqtotalparts = forms  = False)  

8

Не уверен, есть ли у этого подхода какие-либо недостатки, но даже более минимальные, в views.py:

entry = form.save () # save загруженный файлif request.FILES ['myfile  ']: entry.myfile.save (request.F  ILES ['myfile'] ._ name, request.FILES ['myfile'], True)  

Поделиться
Улучшить этот ответ
отредактировано 8 сентября 2014 г. в 11:14
Хуан Сеспеде s
1,1791010 серебряных знаков2626 бронзовых знаков
ответил 19 мая '11 в 13:00
добавить комментарий |

Не уверен, есть ли у этого подхода какие-либо недостатки, но даже более минимальные в views.py:

   entry = form.save () # сохранить загруженный файл, если request.FILES ['myfile']: entry.myfile.save (request.FILES ['myfile'] ._ name, request.FILES ['myfile']  , True)  

0

Я столкнулся с аналогичной проблемой, и ее решил админский сайт django.

  # modelsclass Document (models.Model): docfile = models. FileField (upload_to = 'documents/Temp/% Y/% m/% d') def doc_name (self): return self.docfile.name.split ('/') [- 1] # только имя, а не полный путь  # adminfrom myapp.models import Documentclass DocumentAdmin (admin.ModelAdmin): list_display = ('doc_name',) admin.site.register (Document, DocumentAdmin)  

Поделиться
Улучшить этот ответ
ответил 14 мая '14 в 06:58
  • [введите описание ссылки здесь] [1] [введите описание ссылки здесь] [2] [1]: youtu.be/0tNZB3dyopY [2]: youtu.be/klhMYMc3PlY - uda123, 12 дек. '19 в 14:12
добавить комментарий |

Я столкнулся с аналогичной проблемой, и ее решил админ-сайт django.

  #  modelsclass Document (models.Model): docfile = models.FileField (upload_to = 'documents/Temp/% Y/% m/% d') def doc_name (self): return self.docfile.name.split ('/')  [-1] # только имя, а не полный путь # adminfrom myapp.models import Documentclass DocumentAdmin (admin.ModelAdmin): list_display = ('doc_name',) admin.site.register (Document, DocumentAdmin)  

Оцените статью
Botgadget.ru
Добавить комментарий