今天分享一下Django實現的簡單的文件上傳的小例子。
步驟
•創建Django項目,創建Django應用
•設計模型
•處理urls.py 以及views.py
•設計模板,設計表單
•運行項目,查看數據庫
下面我們就一起來分別完成每一個小部分吧。
創建項目和應用
django-admin startproject Django_upload
django-admin startapp app
添加一個名為upload的目錄,待會要用哦。
然后記得在settings.py 中的INSTALLED_APPS中加上'app',。注意那個小逗號就行了~~
設計模型
上傳文件需要知道是誰上傳的,上傳了什么。所以我們的 模型很簡單,一個用戶名,一個文件名即可。如下app.models.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
from __future__ import unicode_literals from django.db import models # Create your models here. # User CLass for user,username and userimg path class NormalUser(models.Model): username = models.CharField(max_length = 30 ) headImg = models.FileField(upload_to = './upload' ) def __unicode__( self ): return self .username class Meta: ordering = [ 'username' ] |
模型創建完成了,接下來我們就趕緊同步一下數據庫吧。命令很簡單,由于我的Django版本是1.9.6的, 所以原來的
python manage.py syncdb 不能用了
我們可以使用下面的命令來代替
python manage.py makemigrations
python manage.py migrate
urls.py 以及 views.py
這兩個文件就是為了實現MVC模型的V,C而存在的。
views.py 如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
from django.shortcuts import render,render_to_response from django import forms from django.http import HttpResponse from app.models import * # Create your views here. class NormalUserForm(forms.Form): username = forms.CharField() headImg = forms.FileField() def registerNormalUser(request): if request.method = = "POST" : uf = NormalUserForm(request.POST,request.FILES) if uf.is_valid(): # get the info of the form username = uf.cleaned_data[ 'username' ] headImg = uf.cleaned_data[ 'headImg' ] # write in database normalUser = NormalUser() normalUser.username = username normalUser.headImg = headImg normalUser.save() return HttpResponse( 'Upload Succeed!' ) else : uf = NormalUserForm() return render(request, 'register.html' ,{ 'uf' :uf}) |
urls.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
"""Django_upload URL Configuration The `urlpatterns` list routes URLs to views. For more information please see: https://docs.djangoproject.com/en/1.9/topics/http/urls/ Examples: Function views 1. Add an import: from my_app import views 2. Add a URL to urlpatterns: url(r'^$', views.home, name='home') Class-based views 1. Add an import: from other_app.views import Home 2. Add a URL to urlpatterns: url(r'^$', Home.as_view(), name='home') Including another URLconf 1. Import the include() function: from django.conf.urls import url, include 2. Add a URL to urlpatterns: url(r'^blog/', include('blog.urls')) """ from django.conf.urls import url from django.contrib import admin from app.views import * urlpatterns = [ url(r '^admin/' , admin.site.urls), url(r '^register/$' ,registerNormalUser), ] |
一般來說我們會創建一個超級管理員,命令如下:
python manage.py createsuperuser
然后按照相應的提示進行創建就可以了。
設計模板以及表單
其實剛才就可以在views.py中看到一個為NormalUserForm的類,其存在的意義就是方便從request中取得我們需要的表單數據。而且,恐怕你也注意到了,NormalUserForm的字段和NormalUser模型是一樣的呢。各中哲理自己品味吧 :-)
templates/register.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
<!DOCTYPE html> < html lang = "en" > < head > < meta charset = "UTF-8" > < title >Register</ title > </ head > < body > < h2 align = "center" >Register</ h2 > < form method = "POST" enctype = "multipart/form-data" > {% csrf_token %} {{ uf.as_p }} < input type = "submit" value = "Submit" > </ form > </ body > </ html > |
這里面比較重要的地方有三點:
•<form method="POST" enctype="multipart/form-data">: 表單特定的格式,注意上傳數據的時候把enctype明確就可以
•{% csrf_token %}: 跨域請求,我們需要在表單標簽的內部加上這個模板標簽,而且要在views.py中配合render而不是render_to_response來實現
•{{ uf.as_p }}: 使用.as_p 方式的話,django就會按照默認的樣式在模板頁面輸出表單的所有的字段。
調試,開啟應用
好了,大部分的任務都做好了,下面就打開我們的開發服務器來驗證一下吧。
python manage.py runserver
打開瀏覽器輸入http://127.0.0.1:8000/register
然后按要求填寫表單,就可以了。彩蛋就是加上了is_valid()方法的views.py會自動的幫助我們對表單數據字段進行驗證!
打開我們的數據庫管理軟件,就會發現里面存儲的只是路徑,而并不是真正的數據。這也體現了大數據存儲的核心理念了。點擊upload目錄,發現文件確實上傳成功了!
總結
今天的這個小例子雖然很簡單,但是里面也有很多值得我們推敲的地方,我的收獲如下。
•使用models.FileField()實現文件上傳組件
•對應模型添加一個表單類,字段相同。這樣對于表單數據的獲取會更加更加的方便。uf = NormalUserForm(request.POST,request.FILES)。
•模板界面表單enctype格式,以及.as_p方式的在html頁面上的表單輸出
就是這樣了!
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。