使用Django上传文件

几乎参考了下一页。
文件上传

我将在 proj01 项目中创建一个名为 file_upload 的应用程序。

创建一个名为”file_upload”的应用程序。

python manage.py startapp file_upload

2) 编辑proj01/settings.py

省略
INSTALLED_APPS = [
    'file_upload',
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]
省略

3) 编辑 proj01/urls.py

from django.contrib import admin
from django.urls import path
from django.urls import include
import file_upload.views as file_upload


urlpatterns = [
    path('success/url/',file_upload.success),
    path('file_upload/',include('file_upload.urls')),
    path('admin/', admin.site.urls),
]

创建模板

mkdir file_upload/templates
mkdir file_upload/templates/file_upload
<!DOCTYPE html>
<html lang="ja">
<head>
<meta http-equiv="CONTENT-TYPE" content="text/html; charset=utf-8" />
<title>ファイルアップロード</title>
</head>
<body>
    <h1>ファイルをアップロード</h1>
    <form method="POST" enctype="multipart/form-data">
      {% csrf_token %}
      {{ form.as_p }}
      <button type="submit">アップロード</button>
    </form>
<hr />
Dec/26/2018<p />
</body>
</html>

5) 创建file_upload/forms.py

from django import forms

class UploadFileForm(forms.Form):
    title = forms.CharField(max_length=50)
    file = forms.FileField()

6) 编辑 file_upload/views.py

from django.http import HttpResponseRedirect
from django.shortcuts import render
from .forms import UploadFileForm
from django.http import HttpResponse

import sys

# ------------------------------------------------------------------
def file_upload(request):
    if request.method == 'POST':
        form = UploadFileForm(request.POST, request.FILES)
        if form.is_valid():
            sys.stderr.write("*** file_upload *** aaa ***\n")
            handle_uploaded_file(request.FILES['file'])
            file_obj = request.FILES['file']
            sys.stderr.write(file_obj.name + "\n")
            return HttpResponseRedirect('/success/url/')
    else:
        form = UploadFileForm()
    return render(request, 'file_upload/upload.html', {'form': form})
#
#
# ------------------------------------------------------------------
def handle_uploaded_file(file_obj):
    sys.stderr.write("*** handle_uploaded_file *** aaa ***\n")
    sys.stderr.write(file_obj.name + "\n")
    file_path = 'media/documents/' + file_obj.name 
    sys.stderr.write(file_path + "\n")
    with open(file_path, 'wb+') as destination:
        for chunk in file_obj.chunks():
            sys.stderr.write("*** handle_uploaded_file *** ccc ***\n")
            destination.write(chunk)
            sys.stderr.write("*** handle_uploaded_file *** eee ***\n")
#
# ------------------------------------------------------------------
def success(request):
    str_out = "Success!<p />"
    str_out += "成功<p />"
    return HttpResponse(str_out)
# ------------------------------------------------------------------

7) 创建 file_upload/urls.py

from django.urls import path

from . import views

urlpatterns = [
    path('', views.file_upload, name='file_upload'),
]

创建一个文件上传文件夹

mkdir media
mkdir media/documents

8) 移民

python manage.py migrate

9) 启动开发服务器

python manage.py runserver

9) 在浏览器中访问 http://127.0.0.1:8000/file_upload/。

upload_dec2601.png

选择文件并上传,将会被上传到media/documents/文件夹中。

upload_dec2701.png

代码在 GitHub 上。
ekzemplaro/django_file_upload

我已在下一个版本中进行确认。

$ python --version
Python 3.7.3
$ python -m django --version
3.2.9
bannerAds