1. 程式人生 > >django 快速實現檔案上傳(django2.0)

django 快速實現檔案上傳(django2.0)

django2.0 快速實現檔案上傳

本操作環境:

虛擬環境:django2.0 python3.5(應該python3.6都可以使用) window10

1.建立專案與應用(專案和應用都是自己制定的)

建立專案:django-admin startproject FileUpload

然後進入FileUpload資料夾裡面 cd FileUpload

在當前目錄下面建立一個app應用

python manage.py startapp app

操作順序如下,workon django2.0,—->這個相當於開啟虛擬環境(django2.0是虛擬環境的名稱,自己隨便定)

F:\益達學習\django\django2.0
專案>workon django2.0 (django2.0) F:\益達學習\django\django2.0專案>django-admin startproject fileUpload (django2.0) F:\益達學習\django\django2.0專案>cd fileUpload (django2.0) F:\益達學習\django\django2.0專案\fileUpload>python manage.py startapp app

fileUpload資料夾的目錄結構如下:檢視目錄結構的—>tree /f

│  manage.py
│
├─app
│  │  admin.py
│ │ apps.py │ │ models.py │ │ tests.py │ │ views.py │ │ __init__.py │ │ │ └─migrations │ __init__.py │ └─fileUpload │ settings.py │ urls.py │ wsgi.py │ __init__.py │ └─__pycache__ settings.cpython-35.pyc __init__.cpython-35.pyc

開啟fileUpload\fileUpload\settings.py檔案,將app應用新增進去

# Application definition

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'app',
]

2.設計/修改Model(資料庫)

開啟fileUpload\app\models.py檔案,新增如下內容:

from django.db import models

# Create your models here.
class User(models.Model):
    username = models.CharField(max_length = 30)
    headImg = models.FileField(upload_to= './upload/')
    #所以是用upload_to來指定檔案存放的字首路徑

    def __str__(self):
        return self.username

建立兩個欄位,username**存放使用者名稱,headImg存放上傳檔案的路徑**

生成遷移檔案,同步到資料庫

python manage.py makemigrations

python manage.py migrate

會在fileUpload\app\migrations資料夾下面多了一些檔案出來,自己做的時候可以先開啟那個資料夾,執行那個命令的時候觀察變化

(django2.0) F:\益達學習\django\django2.0專案\fileUpload>python manage.py makemigrations
Migrations for 'app':
  app\migrations\0001_initial.py
    - Create model User

(django2.0) F:\益達學習\django\django2.0專案\fileUpload>python manage.py migrate
Operations to perform:
  Apply all migrations: admin, app, 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 app.0001_initial... 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 sessions.0001_initial... OK

3.建立檢視(views.py)

①開啟fileUpload\app\views.py檔案,新增如下內容:

from django.shortcuts import render,render_to_response

# Create your views here.
#函式register裡面的形參request是必須要填的
#render()和render_to_response()均是django中用來顯示模板頁面的

def register(request):
    return render_to_response('register.html',{})

②建立註冊頁面

先在fileUpload\app目錄下建立templates目錄,接著在fileUpload\app\templates目錄下建立register.html 檔案: 這個模板是html5的模板

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>檔案上傳</title>
</head>
<body>
    <h1>register</h1>
</body>
</html>

③設定模板路徑

開啟fileUpload\fileUpload\settings.py檔案,新增內容關於DIRS:

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR,'templates').replace('\\', '/'),],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

④設定url

開啟fileUpload\fileUpload\urls.py檔案,新增如下內容:

from django.contrib import admin
from django.urls import path
from app import views

urlpatterns = [
    path('admin/', admin.site.urls),
    path('app/',views.register),
]

⑤啟動伺服器

python manage.py runserver

(django2.0) F:\益達學習\django\django2.0專案\fileUpload>python manage.py runserver
Performing system checks...

System check identified no issues (0 silenced).
May 08, 2018 - 09:41:29
Django version 2.0.4, using settings 'fileUpload.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CTRL-BREAK.

這裡寫圖片描述
註冊頁面可以正常開啟說明整個過程已經走通。這也是Django開發的基本套路。希望你們一定要熟練理解這個基本套路。

4.完善表單提交

通過上面的過程,我們只是把過程串了起來,我們的register.html 檔案,並沒有建立使用者提交的表單,views.py檔案中也並沒有對使用者提交的資訊做處理。下面我們就針對這兩個檔案進一步的補充。

開啟fileUpload\app\template\register.html檔案,新增如下內容:

: 表單特定的格式,注意上傳資料的時候把enctype明確就可以

{% csrf_token %}: 跨域請求,我們需要在表單標籤的內部加上這個模板標籤,而且要在views.py中配合render而不是render_to_response來實現

{{ uf.as_p }}: 使用.as_p 方式的話,django就會按照預設的樣式在模板頁面輸出表單的所有的欄位。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>檔案上傳</title>
</head>
<body>
    <h1>register</h1>
    <form action="" method="post" enctype="multipart/form-data">
        {% csrf_token %}
        {{uf.as_p}}
        <input type="submit" value="ok">
    </form>
</body>
</html>

開啟fileUpload\app\views.py檔案,新增如下內容:

from django.shortcuts import render,render_to_response
from django import forms #重點要匯入,使用 Django 的 表單 
from django.http import HttpResponse

# Create your views here.
# 用Form建立一個簡單的表單
class UserForm(forms.Form):
    username = forms.CharField()    #字串
    headImg = forms.FileField()     #檔案

#函式register裡面的形參request是必須要填的
#render()和render_to_response()均是django中用來顯示模板頁面的

'''
register函式判斷使用者的是否為POST請求,如果是並驗證是有效的,然後就返回upload ok!,在驗證正確和返回OK的中間放我們的上傳檔案程式碼,因為只有檔案上傳成功能返回OK,我們一會說,如果是GET請求,就直接顯示一個空表單,讓使用者輸入。
'''
def register(request):
    if request.method == "POST":
        uf = UserForm(request.POST,request.FILES)
        if uf.is_valid():   #判斷是否有效
            return HttpResponse('upload ok!')
    else:
        uf = UserForm()
        #返回一個空表單
    return render_to_response('register.html',{'uf':uf})

填寫使用者名稱,選擇本地上傳檔案,點選“ok”

會出現一個403的錯誤,這個錯誤比較友好,所以不是我們操作過程中的小錯誤。

這裡寫圖片描述
接著開啟fileUpload\fileUpload\settings.py檔案,將下面一行程式碼註釋:

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    #'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

5.將資料寫入資料庫裡面

雖然已經實現了資料的提交,但使用者名稱與檔案並沒有真正的寫入到資料庫。我們來進一步的完善fileUpload\app\views.py 檔案:

from django.shortcuts import render,render_to_response
from django import forms
from django.http import HttpResponse
from app.models import User  #這個記得要寫啊

# Create your views here.
class UserForm(forms.Form):
    username = forms.CharField()
    headImg = forms.FileField()

#函式register裡面的形參request是必須要填的
#render()和render_to_response()均是django中用來顯示模板頁面的
#
def register(request):
    if request.method == "POST":
        uf = UserForm(request.POST,request.FILES) #還沒有查到是什麼意思
        #判斷是否為有效的
        if uf.is_valid():
            #獲取表單元素
            username = uf.cleaned_data['username']
            headImg = uf.cleaned_data['headImg']
            # 寫入資料庫
            user = User()
            user.username = username
            user.headImg = headImg
            user.save()
            return HttpResponse('upload ok!')
    else:
        uf = UserForm()
    return render_to_response('register.html',{'uf':uf})

這裡寫圖片描述

在專案的目錄下,我們發現使用者提交的檔案(upload下面有檔案),前提是按照上面的操作一波

通過在命令列提示符上輸入tree /f ,就可以得到整體的目錄

│  db.sqlite3
│  manage.py
│
├─app
│  │  admin.py
│  │  apps.py
│  │  models.py
│  │  tests.py
│  │  views.py
│  │  __init__.py
│  │
│  ├─migrations
│  │  │  0001_initial.py
│  │  │  __init__.py
│  │  │
│  │  └─__pycache__
│  │          0001_initial.cpython-35.pyc
│  │          __init__.cpython-35.pyc
│  │
│  ├─templates
│  │      register.html
│  │
│  └─__pycache__
│          admin.cpython-35.pyc
│          models.cpython-35.pyc
│          views.cpython-35.pyc
│          __init__.cpython-35.pyc
│
├─fileUpload
│  │  settings.py
│  │  urls.py
│  │  wsgi.py
│  │  __init__.py
│  │
│  └─__pycache__
│          settings.cpython-35.pyc
│          urls.cpython-35.pyc
│          wsgi.cpython-35.pyc
│          __init__.cpython-35.pyc
│
└─upload
        2.png

6.檢視資料庫儲存的資訊

F:\益達學習\django\django2.0專案\fileUpload>sqlite3 db.sqlite3
SQLite version 3.23.1 2018-04-10 17:39:29
Enter ".help" for usage hints.
sqlite> .tables
app_user                    auth_user_user_permissions
auth_group                  django_admin_log
auth_group_permissions      django_content_type
auth_permission             django_migrations
auth_user                   django_session
auth_user_groups
sqlite> select * from app_user;
1|1|upload/2.png
2|1|upload/8.gif
3|1|upload/8_eM2ToMF.gif
4|1|upload/1.png
5|1|upload/1_rosJvBs.png
6|1|upload/2.gif
7|123|upload/2.jpg

網上說通過檢視資料庫發現,我們資料庫中存放的並非使用者上傳的檔案本身,而是檔案的存放路徑。

當然可以在此基礎上進行擴充套件,比如修改樣式,使得介面變得好看點,使用者提交成功後,將使用者名稱上傳的檔名顯示出來等。只要你有想法,一切都可以實現,向著自己的夢想前進。