장고에서 CSV 업로드, 데이터 처리 및 다운로드 기능을 만들려고했습니다.

14961 단어 장고3.0CSV파이썬

하고 싶은 일



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.pyindex 메조에 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_fileswrite_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/

좋은 웹페이지 즐겨찾기