Django에서 파일 업로드

Vaibhav Vaibhav 2023년1월30일
  1. Django 환경 설정
  2. Django 프로젝트 설정
  3. 서버 테스트
  4. settings.py파일 업데이트
  5. 모델 생성
  6. 파일 업로드를위한 양식 만들기
  7. 보기 추가
  8. urls.py파일 구성
  9. 테스팅
Django에서 파일 업로드

이 기사는 Django에서 파일을 업로드하는 방법을 안내합니다. 세부 사항을 입력하고 파일을 선택하는 간단한 양식으로 간단한 응용 프로그램을 만듭니다. 또한 아래 표에 업로드 된 모든 파일을 표시합니다.

계속 진행하기 전에이 프로젝트에 대한 새 폴더 또는 디렉터리를 만들어 정리를 유지하는 것이 좋습니다.

Django 환경 설정

이 튜토리얼에서는 가상 환경을 사용합니다. 가상 환경을 반드시 사용해야하는 것은 아니지만 모든 프로젝트에 대해 고유 한 가상 환경을 사용하는 것이 좋습니다.

가상 환경을 구축하려면 Python 패키지virtualenv가 필요합니다. 컴퓨터에없는 경우 다음 명령을 사용하여 다운로드 할 수 있습니다.

pip install virtualenv

이제 패키지를 설치 했으므로 환경을 만들어 보겠습니다.

환경을 생성하려면 다음 명령을 실행하십시오.

virtualenv environment

environment는 방금 만든 가상 환경의 이름입니다. 이 환경은 Python 버전이 컴퓨터에 전역으로 설치되며 기본 패키지를 제외하고는 패키지가 없습니다.

이 환경을 활성화하고 사용하려면 다음 명령을 실행하십시오.

environment\Scripts\activate

이제 우리는 Django에 대해 배우고 있으므로 Django 라이브러리가 설치되어 있어야합니다. 또한 파일 업로드를 배우고 있으므로 이미지를 처리하기 위해 추가 Python 패키지가 필요합니다. 패키지 이름은Pillow입니다. 모든 종속성을 설치합시다.

pip install django
pip install Pillow

또는,

pip3 install django
pip3 install Pillow

이 글을 쓰는 시점에서 최신 Django 버전은3.2입니다.

Django 프로젝트 설정

Django 프로젝트를 설정하려면 먼저 Django 프로젝트를 만들고, 애플리케이션을 만들고, 해당 애플리케이션을 등록하고, 초기 마이그레이션을 수행해야합니다.

Django 프로젝트를 만들려면 다음 명령어를 실행하세요.

django-admin startproject DjangoFileUpload

이제 다음 명령을 사용하여 작업 디렉토리를이 프로젝트로 변경하십시오.

cd DjangoFileUpload

Django 프로젝트 내에서 애플리케이션을 만들려면 다음 명령을 실행합니다.

django-admin startapp Core

또는,

python manage.py startapp Core

Core는 애플리케이션의 이름입니다.

이 애플리케이션을 등록하려면settings.py파일의INSTALLED_APPS목록에 애플리케이션 이름을 입력합니다.

  • settings.py
INSTALLED_APPS = [
    "django.contrib.admin",
    "django.contrib.auth",
    "django.contrib.contenttypes",
    "django.contrib.sessions",
    "django.contrib.messages",
    "django.contrib.staticfiles",
    "Core",  # Here
]

Django가 제대로 작동하려면 몇 가지 모델이 필요합니다. 예를 들어 인증 시스템 또는 수퍼 유저는 초기 마이그레이션 없이는 작동하지 않습니다. 따라서 초기 마이그레이션을 수행하려면 다음 명령을 실행하십시오.

python manage.py migrate

출력:

Operations to perform:
  Apply all migrations: admin, auth, contenttypes, sessions
Running migrations:
  Applying contenttypes.0001_initial... OK
  Applying auth.0001_initial... OK
  Applying admin.0001_initial... OK
  Applying admin.0002_logentry_remove_auto_add... OK
  Applying admin.0003_logentry_add_action_flag_choices... OK
  Applying contenttypes.0002_remove_content_type_name... OK
  Applying auth.0002_alter_permission_name_max_length... OK
  Applying auth.0003_alter_user_email_max_length... OK
  Applying auth.0004_alter_user_username_opts... OK
  Applying auth.0005_alter_user_last_login_null... OK
  Applying auth.0006_require_contenttypes_0002... OK
  Applying auth.0007_alter_validators_add_error_messages... OK
  Applying auth.0008_alter_user_username_max_length... OK
  Applying auth.0009_alter_user_last_name_max_length... OK
  Applying auth.0010_alter_group_name_max_length... OK
  Applying auth.0011_update_proxy_permissions... OK
  Applying auth.0012_alter_user_first_name_max_length... OK
  Applying sessions.0001_initial... OK

서버 테스트

서버를 실행하려면 다음 명령을 사용하십시오. 모든 것이 오류없이 진행 되었다면 장고 서버가http://127.0.0.1:8000/에서 실행되는 것을 볼 수 있습니다.

python manage.py runserver

settings.py파일 업데이트

업로드 된 파일은 어딘가에 저장해야합니다. Django에서는 기본적으로 업로드 된 모든 파일이media폴더에 저장됩니다. 언제든지 폴더의 이름과 폴더와 관련된 URL을 변경할 수 있지만 기본 명명 규칙을 따릅니다.

미디어 파일의 URL MEDIA_URL및 미디어 폴더의 경로MEDIA_ROOT를 정의하려면settings.py파일에 다음 문을 추가합니다.

  • settings.py
import os

MEDIA_URL = "/media/"
MEDIA_ROOT = os.path.join(BASE_DIR, "media")

os모듈을 가져 오는 것을 잊지 마십시오. 그렇지 않으면 Python에서 오류가 발생합니다.

모델 생성

업로드 된 파일을 저장하려면 모델을 생성해야합니다. 이 모델의 필드는 업로드 된 파일의 경로를 보유하지만 파일 자체는 보유하지 않습니다.

업로드 된 파일에 대한 세부 정보를 저장하기 위해 모델Document를 생성합니다.

  • Core\models.py
from django.db import models


class Document(models.Model):
    title = models.CharField(max_length=200)
    uploadedFile = models.FileField(upload_to="Uploaded Files/")
    dateTimeOfUpload = models.DateTimeField(auto_now=True)

모델에는 업로드 된 파일의 사용자 지정 제목을 저장하기위한 문자 유형의title필드가 있으며dateTimeOfUpload는 파일 업로드 날짜 및 시간을 저장합니다. 날짜-시간 필드는 모델 개체가 생성 될 때 자동으로 설정됩니다.

파일을 저장하기 위해FileField()를 사용합니다. 이 유형은 모든 종류의 파일을 포함합니다. 그러나 이미지를 좀 더 구체적으로 지정하려면ImageField()를 사용하여 이미지를 저장할 수 있습니다. 다른 모든 필드의 경우FileField()를 고수해야합니다.

upload_to매개 변수는이 모델의 파일이media폴더에 업로드 될 폴더를 정의하는 데 사용됩니다.

이 모델을 사용하기 전에 마이그레이션을 수행하고 마이그레이션해야합니다. 이를 위해 다음 두 명령을 실행하십시오.

python manage.py makemigrations
python manage.py migrate

파일 업로드를위한 양식 만들기

Core애플리케이션 또는 폴더 내에서templates라는 새 폴더를 만듭니다. 이 폴더 안에Core라는 다른 폴더를 만듭니다. 애플리케이션의 이름이어야합니다. 마지막으로이 폴더 안에upload-file.html이라는 새 파일을 만듭니다.

이제 이와 같은 파일 구조가 있어야합니다.

DjangoFileUpload/
    DjangoFileUpload/
        __init__.py
        asgi.py
        settings.py
        urls.py
        wsgi.py
    db.sqlite3
    manage.py
    Core/
        migrations/
        templates/
            Core/
                upload-file.html
        __init__.py
        admin.py
        apps.py
        models.py
        tests.py
        views.py

upload-file.html안에 다음 HTML을 추가합니다.

  • Core\templates\Core\upload-file.html
<!DOCTYPE html>
{% load static %}
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Django File Upload</title>
    <style>
        @import url('https://fonts.googleapis.com/css2?family=Roboto&display=swap');

        * {
            font-family: "Roboto";
        }

        body {
            background-color: #F5F5F5;
        }

        form {
            background-color: #FFFFFF;
            padding: 25px;
        }

        table {
            width: 100%; 
            text-align: center;
            margin-top: 25px;
            padding: 25px;
            background-color: #FFFFFF;
        }

        table tr td {
            padding-top: 15px;            
        }
    </style>
</head>
<body>
    <form action="{% url 'Core:uploadFile' %}" method="POST" enctype="multipart/form-data">
        <input type="text" name="fileTitle" placeholder="Enter a title">
        <input type="file" name="uploadedFile">
        {% csrf_token %}
        <input type="submit" value="Upload">
    </form>
    <table>
        <tr>
            <th>ID</th>
            <th>Title</th>
            <th>File Path</th>
            <th>Upload Date & Time</th>
        </tr>
        {% for file in files %}
            <tr>
                <td>{{ file.id }}</td>
                <td>{{ file.title }}</td>
                <td>{{ file.uploadedFile.url }}</td>
                <td>{{ file.dateTimeOfUpload }}</td>
            </tr>
        {% endfor %}
    </table>
</body>
</html>

테이블 안에 업로드 된 파일에 대한 세부 정보가 표시됩니다.

보기 추가

HTML 템플릿과 정보를 표시하고 파일 업로드를 저장 및 처리하기 위해uploadFile()뷰를 생성합니다.

다음 코드를 참조하십시오

  • Core\views.py
from . import models
from django.shortcuts import render


def uploadFile(request):
    if request.method == "POST":
        # Fetching the form data
        fileTitle = request.POST["fileTitle"]
        uploadedFile = request.FILES["uploadedFile"]

        # Saving the information in the database
        document = models.Document(title=fileTitle, uploadedFile=uploadedFile)
        document.save()

    documents = models.Document.objects.all()

    return render(request, "Core/upload-file.html", context={"files": documents})

이보기는 이전 섹션에서 방금 만든 HTML 템플릿을 렌더링합니다. HTML 템플릿의 양식은 동일한 URL로 제출되고이보기에서 처리됩니다. 요청 방법이POST인 경우 양식에 입력 한 정보와 업로드 된 파일을 가져 와서 해당 정보를 모델에 저장하고 모델을 저장합니다.

그렇지 않으면 일반적인 경우 업로드 된 모든 파일을 가져 와서 HTML 템플릿에 표시 할 컨텍스트 사전으로 보냅니다.

urls.py파일 구성

마지막으로 URL을 설정하겠습니다. 계속 진행하기 전에Core애플리케이션 또는 폴더 내에urls.py라는 새 파일을 만듭니다. 이 파일은이 Django 애플리케이션과 관련된 모든 URL을 보유합니다. 모든 Django 애플리케이션에 대해 별도의urls.py파일을 갖는 것이 좋습니다.

이 파일 안에 다음 코드를 추가하십시오.

from . import views
from django.urls import path
from django.conf import settings
from django.conf.urls.static import static

app_name = "Core"

urlpatterns = [
    path("", views.uploadFile, name="uploadFile"),
]

if settings.DEBUG:
    urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

HTML 템플릿upload-file.html에 대한 URL 패턴을 추가했습니다. 또한 미디어 파일에 대한 URL을 하나 더 추가했습니다. settings.py파일에서 선언 한 상수 변수를 사용합니다.

Core애플리케이션 내에 새urls.py파일을 만들었으므로 여기에 정의 된 URL을 기본 프로젝트와 연결해야합니다.

그렇게하려면DjangoFileUpload\urls.pyurlpatterns목록에 다음 문을 추가합니다.

path("", include("Core.urls")),

파일은 다음과 같아야합니다.

파일 :DjangoFileUpload\urls.py

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path("admin/", admin.site.urls),
    path("", include("Core.urls")),
]

테스팅

축하합니다! 이제 프로젝트를 테스트 할 시간입니다. 아래 단계를 따르십시오.

  • 명령을 사용하여 서버 시작-python manage.py runserver
  • URL http://127.0.0.1:8000/로 이동
  • 양식에 제목을 입력하고 파일을 선택한 후 양식을 제출합니다.

이제 양식 아래의 표에서 파일에 대한 세부 정보를 볼 수 있습니다.

또한 작업 디렉토리를 확인하면media라는 이름의 폴더가 생성 된 것을 볼 수 있으며,이 폴더 안에는Uploaded Files이름의 다른 폴더가 있습니다. 이 폴더에는 업로드 된 모든 파일이 포함되어 있습니다.

사진, 동영상, 프로그램, PDF, JSON 파일, HTML 파일 등을 업로드 할 수 있습니다. 업로드 시간은 파일 크기에 따라 다르므로 업로드 할 때 인내심을 가져야합니다.

Vaibhav Vaibhav avatar Vaibhav Vaibhav avatar

Vaibhav is an artificial intelligence and cloud computing stan. He likes to build end-to-end full-stack web and mobile applications. Besides computer science and technology, he loves playing cricket and badminton, going on bike rides, and doodling.