Уф, документация Django действительно не имеет хорошего примера по этому поводу. Я потратил более 2 часов, чтобы выкопать все кусочки, чтобы понять, как это работает. С этим знанием я реализовал проект, который позволяет загружать файлы и показывать их в виде списка. Чтобы загрузить исходный код проекта, посетите https://github.com/axelpale/minimal-django-file-upload-example или клонируйте его:
> git clone https://github.com/axelpale/minimal-django-file-upload-example.git
Обновление 2013-01-30: Источник на 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 .
Обновление 2015-09-04: Django 1.8 поддерживается на GitHub, благодаря nerogit .
Обновление 2016-07-03: Django 1.9 поддерживается на GitHub, благодаря daavve и nerogit
Дерево проекта
Базовый проект Django 1.3 с одним приложением и медиа / каталогом для загрузки.
minimal-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 os
BASE_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 -*-
from django.db import models
class Document(models.Model):
docfile = models.FileField(upload_to='documents/%Y/%m/%d')
3. Форма: myproject / myapp / forms.py
Для удобной загрузки вам нужна форма. Эта форма имеет только одно поле, но этого достаточно. См. Ссылку FileField формы для деталей.
# -*- coding: utf-8 -*-
from django import forms
class DocumentForm(forms.Form):
docfile = forms.FileField(
label='Select a file',
help_text='max. 42 megabytes'
)
4. Просмотр: myproject / myapp / views.py
Вид, где происходит вся магия. Обратите внимание, как request.FILES
обрабатываются. Для меня было действительно трудно определить факт, который request.FILES['docfile']
можно сохранить в моделях. FileField просто так. Модель save () автоматически обрабатывает сохранение файла в файловой системе.
# -*- coding: utf-8 -*-
from django.shortcuts import render_to_response
from django.template import RequestContext
from django.http import HttpResponseRedirect
from django.core.urlresolvers import reverse
from myproject.myapp.models import Document
from myproject.myapp.forms import DocumentForm
def list(request):
# Handle file upload
if request.method == 'POST':
form = DocumentForm(request.POST, request.FILES)
if form.is_valid():
newdoc = Document(docfile = request.FILES['docfile'])
newdoc.save()
# Redirect to the document list after POST
return HttpResponseRedirect(reverse('myapp.views.list'))
else:
form = DocumentForm() # A empty, unbound form
# Load documents for the list page
documents = Document.objects.all()
# Render list page with the documents and the form
return render_to_response(
'myapp/list.html',
{'documents': documents, 'form': form},
context_instance=RequestContext(request)
)
5. URL проекта: myproject / urls.py
Django не обслуживает MEDIA_ROOT по умолчанию. Это было бы опасно в производственной среде. Но на стадии разработки мы могли бы прервать. Обратите внимание на последнюю строчку. Эта строка позволяет Django обслуживать файлы из MEDIA_URL. Это работает только в стадии разработки.
Подробности смотрите в django.conf.urls.static.static . Смотрите также это обсуждение об обслуживании медиа-файлов .
# -*- coding: utf-8 -*-
from django.conf.urls import patterns, include, url
from django.conf import settings
from django.conf.urls.static import static
urlpatterns = 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, url
urlpatterns = 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}} как в шаблоне. Подробнее об этом см. В статье « Использование файлов в моделях» и документации по объекту «Файл» .
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Minimal Django File Upload Example</title>
</head>
<body>
<!-- List of uploaded documents -->
{% if documents %}
<ul>
{% for document in documents %}
<li><a href="{{ document.docfile.url }}">{{ document.docfile.name }}</a></li>
{% endfor %}
</ul>
{% else %}
<p>No documents.</p>
{% endif %}
<!-- Upload form. Note enctype attribute! -->
<form action="{% url 'list' %}" method="post" enctype="multipart/form-data">
{% csrf_token %}
<p>{{ form.non_field_errors }}</p>
<p>{{ form.docfile.label_tag }} {{ form.docfile.help_text }}</p>
<p>
{{ form.docfile.errors }}
{{ form.docfile }}
</p>
<p><input type="submit" value="Upload" /></p>
</form>
</body>
</html>
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 / и могут быть открыты из списка.
Я надеюсь, что этот ответ поможет кому-то так же, как и мне.
{% url list %}
делается{% url "list" %}
.Вообще говоря, когда вы пытаетесь «просто получить рабочий пример», лучше всего «просто начать писать код». Здесь нет кода, который мог бы вам помочь, поэтому он делает ответ на этот вопрос намного более полезным для нас.
Если вы хотите получить файл, вам нужно что-то вроде этого в html-файле:
Это даст вам кнопку обзора, кнопку загрузки, чтобы начать действие (отправить форму) и отметить энктип, чтобы Django знал, чтобы дать вам
request.FILES
В представлении где-то вы можете получить доступ к файлу с
В документах для загрузки файлов содержится огромное количество информации.
Я рекомендую вам внимательно прочитать страницу и просто начать писать код, а затем возвращаться с примерами и трассировкой стека, когда он не работает.
источник
enctype="multipart/form-data"
, Что мне нужно , чтобы сделать эту работу, спасибо!демонстрация
Смотрите репозиторий github , работает с Django 3
Минимальный пример загрузки файла Django
1. Создайте проект Django
Запустите startproject ::
Теперь папка ( образец ) создана.
2. создать приложение
Создать приложение ::
Теперь папка (
uploader
) с этими файлами создана:3. Обновите settings.py
На
sample/settings.py
оных'uploader'
кINSTALLED_APPS
и добавитьMEDIA_ROOT
иMEDIA_URL
, то есть ::4. Обновите urls.py
в
sample/urls.py
добавлении ::5. Обновите models.py
обновление
uploader/models.py
::6. Обновите views.py
обновление
uploader/views.py
::7. создавать шаблоны
Создайте папку sample / uploader / templates / uploader
Создайте файл upload_form.html т.е.
sample/uploader/templates/uploader/upload_form.html
::8. Синхронизировать базу данных
Синхронизировать базу данных и сервер запуска ::
посетите http: // localhost: 8000 /
источник
FileField
то время, а Сухаил использовалImageField
, может кто-нибудь объяснить, пожалуйста, выбор?FileField
.ImageField
необходимо только для загрузки изображения. обновление будет работать с Django 1.11.Я должен сказать, что нахожу документацию в Django запутанной. Также для простейшего примера, почему упоминаются формы? Пример, который я получил для работы в views.py:
HTML-файл выглядит как приведенный ниже код, хотя в этом примере загружается только один файл, а код для сохранения файлов обрабатывает множество: -
Эти примеры не являются моим кодом, они были получены из двух других примеров, которые я нашел. Я относительный новичок в Django, поэтому очень вероятно, что я упустил какой-то ключевой момент.
источник
FileField
и аmodel.Form
. Для начинающих (и для тривиальных задач) ручная обработка загруженных файлов, как показано выше, менее запутанна.У меня тоже было подобное требование. Большинство примеров в сети просят создать модели и формы, которые я не хотел использовать. Вот мой окончательный код.
И в HTML для загрузки я написал:
Ниже приводится HTML, который отображает содержимое файла:
источник
Продолжая на примере Генри :
Вы можете вызвать эту
handle_uploaded_file
функцию из своего поля зрения с загруженным файловым объектом. Это сохранит файл с уникальным именем (с префиксом имени исходного загруженного файла) в файловой системе и вернет полный путь сохраненного файла. Вы можете сохранить путь в базе данных и что-то сделать с файлом позже.источник
request.FILES['myfile']
)handle_uploaded_file
, а неrequest
самому себе.prefix=source.name
его использовании добавляются дополнительные символы в конце файла, что портит расширение файла. Например,upload.csv
изменился наupload.csv5334
. Меняя это, чтобыsuffix=source.name
исправить это для меня.Здесь это может помочь вам: создайте поле файла в вашем models.py
Для загрузки файла (в вашем admin.py):
и используйте это поле в вашем шаблоне.
источник
Вы можете обратиться к примерам сервера в Fine Uploader, который имеет версию django. https://github.com/FineUploader/server-examples/tree/master/python/django-fine-uploader
Это очень элегантный и самый важный из всех, он предоставляет JS lib. Шаблон не включен в примеры серверов, но вы можете найти демо на его сайте. Fine Uploader: http://fineuploader.com/demos.html
Джанго-тонкий загрузчик
views.py
UploadView отправляет запрос на публикацию и удаление соответствующим обработчикам.
forms.py
источник
Не уверен, есть ли какие-либо недостатки в этом подходе, но еще более минимальный, в views.py:
источник
Я столкнулся с подобной проблемой и решил администратор сайта django.
источник