Как у меня может быть форма с FileField, где загруженный файл не будет сохранен, но вместо этого его текстовое содержание будет извлечено и отображено?
Документы: http://docs.djangoproject.com/en/dev/topics/http/file-uploads/
Краткая версия:
формы Поле .FileField
. HttpRequest
(обычно называется запрос
). request.FILES []
. Например, если ваша форма содержит:
upFile = forms.FileField
, тогда ваше представление может перейти к файлу с помощью:
def uploadView(request):
upFile = request.FILES["upFile"]
где upFile
- это объект UploadedFile
, то есть ] не файловый объект. UploadedFile
имеет следующие свойства:
имя
: имя загруженного файла размер
: размер в байтах и следующие методы:
чтение ( )
: прочитать весь файл и вернуть в виде строки. Возможно, подходит для вас, но не рекомендуется для файлов размером более 2,5 МБ. multiple_chunks ()
: возвращает True
, если файл должен обрабатываться как несколько фрагментов. chunks ()
: возвращает генератор (используйте его как итератор), который возвращает данные файла по частям. Итак, продолжая пример, если вы просто хотите сохранить файл на диск, вы можете написать:
outFile = open("/tmp/uploadTest.txt", "w")
if not upFile.multiple_chunks():
outFile.write(upFile.read())
else:
for chunk in upFile.chunks():
outFile.write(chunk)
outFile.close()
В вашем случае вы, вероятно, могли бы просто показать сообщение об ошибке и удалить файл, если multiple_chunks ()
возвращает True
, поскольку вы, вероятно, не хотите размещать на своей странице более 2,5 МБ текста.
РЕДАКТИРОВАТЬ: Ну, ваш вопрос полностью изменился, пока я писал свой ответ.Итак, объясняя, как поместить содержимое файла на страницу, и предполагая, что размер файла не превышает 2,5 МБ, ваша функция просмотра может выглядеть так:
def uploadView(request):
upFile = request.FILES["upFile"]
context = {}
if upFile.multiple_chunks():
context["uploadError"] = "Uploaded file is too big (%.2f MB)." % (upFile.size,)
else:
context["uploadedFile"] = upFile.read()
return render_to_response('fileUploadPage.html', context)
Добавление, конечно, любой другой обработки представления, которая вам нужна.
Тогда в вашем шаблоне fileUploadPage.html
должно быть где-то:
<div id="uploaded">
{% if uploadError %}
<span class="error">{{ uploadError }}</span>
{% else %}
{{ uploadedFile }}
{% endif %}
</div>
РЕДАКТИРОВАТЬ 2: Доминик имеет хорошее мнение. Вот общий код шаблона для правильной установки тега form
. Используйте это в шаблоне, который имеет форму:
<form method="post" action="{% url uploadFile %}"
{% if form.is_multipart %}
enctype="multipart/form-data"
{% endif %}>
{{ form }}
</form>
В вашем случае, поскольку вы знаете, что в форме будет файл, вы можете потерять блок if
:
<form method="post" action="{% url uploadFile %}" enctype="multipart/form-data">
{{ form }}
</form>
Примечание: {% url ___%}
команда вставит URL-адрес представления или именованный URL-адрес. Параметр - это либо имя функции просмотра, используемое в вашем файле urls.py
, либо имя, присвоенное объекту url
, например:
urlpatterns = patterns('',
url('^uploadform$', 'myapp.views.uploadFormView', name='uploadForm'),
url('^upload$', 'myapp.views.uploadView', name='uploadFile'),
# ...
)