2016-02-07 1 views
1

Python: 2.7.11Django загрузить и обработать файл, без сохранения данных

Джанго: 1,9

Я хочу, чтобы загрузить файл CSV в Django и проанализировать его с классом Python. Сохранение не разрешено, и файл нужен только для доступа к классу, который необходимо проанализировать. Я использую Dropzone.js для формы, но я не понимаю, как мне настроить/запрограммировать представления для достижения этой цели.

<form action="/upload/" method="post" enctype="multipart/form-data" class="dropzone" id="dropzone"> 
    {% csrf_token %} 
    <div class="fallback"> 
     <input name="file" type="file" multiple /> 
    </div> 
</form> 

Я нашел article об этом, но он описывает сохранение и основан на Django 1.5.

view.py

def upload(request): 
if request.method == 'POST': 
    file = FileUploadForm(request.POST) 
    if file.is_valid(): 
     return HttpResponseRedirect('/upload/') 
else: 
    file = FileUploadForm() 

return render(request, 'app/upload.html', {'file': file}) 

forms.py

from django import forms 
class FileUploadForm(forms.Form): 
    file = forms.FileField() 

Заключительное Обновление: Самое важное различие между помогающего ответа и моей ситуации в том, что я должен был расшифровать мой вход. Смотрите следующую строку, как моя csv_file в handle_csv_data:

StringIO(content.read().decode('utf-8-sig')) 
+0

Улица в вашей ссылке недействительна. Это статья? https://amatellanes.wordpress.com/2013/11/05/dropzonejs-django-how-to-build-a-file-upload-form/ –

+0

@ HåkenLid Да, извините, это тот. Я исправил это в вопросе. –

+0

Что вы пробовали? Можете ли вы разместить свою форму и просмотреть код? И что именно вы подразумеваете под «невозможностью сохранения». –

ответ

1

доступ к файлу CSV в функции просмотра. Если вы используете python 3, вы должны обернуть InMemoryUploadedFile в TextIOWrapper, чтобы проанализировать его с помощью модуля csv.

В этом примере csv анализируется и передается обратно как список с именем «контент», который будет отображаться в виде таблицы.

views.py

import csv 
import io # python 3 only 

def handle_csv_data(csv_file): 
    csv_file = io.TextIOWrapper(csv_file) # python 3 only 
    dialect = csv.Sniffer().sniff(csv_file.read(1024), delimiters=";,") 
    csv_file.seek(0) 
    reader = csv.reader(csv_file, dialect) 
    return list(reader) 


def upload_csv(request): 
    csv_content=[] 
    if request.method == 'POST': 
     csv_file = request.FILES['file'].file 
     csv_content = handle_csv_data(csv_file) 
    return render(request, 'upload.html', {'content':content}) 

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

upload.html

<form action="/upload/" 
     method="post" 
     enctype="multipart/form-data" 
     class="dropzone" 
     id="dropzone"> 
    {% csrf_token %} 
    <div class="fallback"> 
     <input name="file" type="file"/> 
     <input type="submit"/> 
    </div> 
    </form> 
    {% if content %} 
    <table> 
    {% for row in content %} 
    <tr> 
    {% for col in row %} 
     <td>{{ col }}</td> 
    {% endfor %} 
    </tr> 
    {% endfor %} 
    </table> 
    {% endif %} 

Я добавил кнопку 'Отправить', так это работает без Dropzone вещи. Я также удалил «multiple» из ввода файла, чтобы упростить пример. Наконец, есть таблица, если шаблон получает контент из разбора csv. Но при использовании dropzone.js вы должны использовать функцию обратного вызова javascript для отображения таблицы.

+0

Спасибо за код. Кажется, он не прошел проверку is_valid(). Я обновляю сообщение, чтобы показать вам, что находится внутри FileUploadForm, потому что я не уверен, что я должен делать с ним. –

+0

Спасибо, это похоже на правильный путь. Все указатели приветствуются. Код сейчас беспорядок, но это только потому, что я хочу заставить его работать, а затем настроить его правильно. Сейчас я, похоже, получаю следующее сообщение: «принуждение к Unicode: нужна строка или буфер, найденный InMemoryUploadedFile». Можно ли переходить из InMemoryUploadedFile в буфер? –

+0

Это похоже на чтение файла, но поскольку я пытаюсь открыть его с помощью «codecs.open (location, 'r', encoding = enc) как csvfile:« это дает мне ошибку, говоря, что имя файла длинное. Место, которое вы можете увидеть здесь, - это csv_file. –

Смежные вопросы