장고에서 CSV 업로드, 데이터 처리 및 다운로드 기능을 만들려고했습니다.
하고 싶은 일
CSV를 여러 개 캡처하고 처리를 한 다음 결과를 CSV로 반환합니다.
이번에는 이하의 케이스를 사용해 이것을 실장한다.
케이스
한 대학에서 다음 CSV를 사용할 수 있습니다.
available.csv
에서는 각 클래스의 용량이 얼마나 많은 정보가 있습니다.reserved.csv
에서는, 각 클래스에서 몇 명의 학생이 수업을 이수할 예정인지의 정보를 가진다.이번에 이러한 파일을 브라우저상에서 업로드하면 현재 얼마나 각 클래스에 여유가 있는지를 나타내는 CSV를 다운로드하는 앱을 작성한다.
디자인
프론트 측에서는 주로 다음 두 가지 움직임이 있습니다.
①: 파일 업로드
② : 업로드된 파일을 바탕으로 각 클래스의 빈 공간을 나타내는 CSV를 내뿜는다
전제
장고 프로젝트 폴더 (
myproject
)와 응용 프로그램 폴더 (app
)가 이미 있다고 가정합니다. 그렇지 않은 경우 여기를 참조하십시오.폴더 구성
이번에는 다음과 같은 폴더 구성을 취한다.
├─app
│ │ admin.py
│ │ apps.py
│ │ forms.py
│ │ functions.py
│ │ models.py
│ │ tests.py
│ │ views.py
│ │ __init__.py
│ │
│ ├─migrations
│ │ __init__.py
│ │
│ ├─static
│ │ └─upload
│ │ test.txt
│ │
│ └─templates
│ index.html
│
├─myproject
│ │ settings.py
│ │ urls.py
│ │ wsgi.py
│ │ __init__.py
│ │
│ └─static
│ humans.txt
│
└─staticfiles
양식 작성
먼저 파일을 업로드할 수 있도록 다음과 같이
forms.py
로 양식을 정의한다.from django import forms
#ClassroomFormを定義
class ClassroomForm(forms.Form):
availablity = forms.FileField()
reservation = forms.FileField()
양식을 HTML로 전달
다음으로, 작성한 폼을 프런트 측에서 표시하기 위해, 다음과 같이
views.py
로 폼을 HTML에 건네준다.from django.shortcuts import render
from app.forms import ClassroomForm
def index(request):
###ClassroomFormをindex.htmlに渡す
classroom = ClassroomForm()
return render(request,"index.html",{'form':classroom})
이제
index.html
에서 {{ form.as_p }}
를 사용하고 다음과 같이 양식을 잡아 당깁니다.<body>
<form method="POST" class="post-form" enctype="multipart/form-data">
{% csrf_token %}
{{ form.as_p }}
<button type="submit" class="save btn btn-default">Save</button>
</form>
</body>
POST 처리
이 양식을 제출하면
views.py
의 index
메조에 POST 된 정보가 전달됩니다. 그러므로, POST 처리를 하도록index
를 이하와 같이 재기록한다.from django.shortcuts import render
from django.http import HttpResponse
from app.functions import process_files
from app.functions import write_into_csv
from app.forms import ClassroomForm
from django.template import loader
import csv
def index(request):
if request.method == 'POST':
classroom = ClassroomForm(request.POST, request.FILES)
#classroomにデータがある場合
if classroom.is_valid():
availability = request.FILES['availablity']
reservation = request.FILES['reservation']
#implement process_files
csv_data = process_files(availability, reservation)
#download result as a csv format
response = write_into_csv(csv_data)
return response
else:
###ClassroomFormをindex.htmlに渡す
classroom = ClassroomForm()
return render(request,"index.html",{'form':classroom})
여기서는
functions.py
에 정의 된 process_files
와 write_into_csv
라는 두 개의 메조를 호출합니다. 다음으로이 메조트를 정의한다.로직 정의
functions.py
에서 views.py
에서 사용할 로직을 정의합니다.import csv
from django.http import HttpResponse
### Process csv files
def process_files(availability, reservation):
""" Description
:type availability:
:param availability:
:type reservation:
:param reservation:
:raises:
:rtype:
"""
availability_dict = convert_to_dict(availability)
reservation_dict = convert_to_dict(reservation)
csv_data = []
courses = list(availability_dict)
for course in courses:
remaining = availability_dict[course] - reservation_dict[course]
row = [course, remaining]
csv_data.append(row)
return csv_data
def convert_to_dict(file):
""" Description
:type file:
:param file:
:raises:
:rtype:
"""
data = file.read().decode("utf-8-sig")
lines = data.split("\r\n")
dict = {}
for line in lines:
fields = line.split(",")
course = fields[0]
capacity = int(fields[1])
dict[course] = capacity
return dict
def write_into_csv(csv_data):
""" Description
:type csv_data:
:param csv_data:
:raises:
:rtype:
"""
response = HttpResponse(content_type='text/csv')
response['Content-Disposition'] = 'attachment; filename="download.csv"'
writer = csv.writer(response)
for row in csv_data:
writer.writerow(row)
return response
이상으로 설계대로의 기능을 실장할 수 있었다.
하지만
마지막으로
도움이 되면 꼭 라이크를 해 주세요.
Github
참고
htps //w w. 그럼 t Poin t. 코 m / d 짱고 훗
htps : // 코데펜. 이오 / 아다 m / / 펜 / VY ぺ wx
htps //w w. py 텐시 rcぇ. 코 m / 포 st / 30 / 호 w ー ー p ぉ 아 d 앤 d p 로세 s s ぇ-csv 푸 ぇ
htps : // 니토 ぇ ぇ ぇ ろ ら m. 코 m / 쿠 s와 미제 - 프 t ty ぺ ふぃ ぇ /
htps : // / cs. d 쟈고 p 로지 ct. 코 m/엔/3.0/토피 cs/후 rms/
Reference
이 문제에 관하여(장고에서 CSV 업로드, 데이터 처리 및 다운로드 기능을 만들려고했습니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/norifumi92/items/a4b3dc4b3a1d474317c8텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)