Python+django实现简单的文件上传
今天分享一下Django实现的简单的文件上传的小例子。
步骤
•创建Django项目,创建Django应用
•设计模型
•处理urls.py以及views.py
•设计模板,设计表单
•运行项目,查看数据库
下面我们就一起来分别完成每一个小部分吧。
创建项目和应用
django-adminstartprojectDjango_upload
django-adminstartappapp
添加一个名为upload的目录,待会要用哦。
然后记得在settings.py中的INSTALLED_APPS中加上'app',。注意那个小逗号就行了~~
设计模型
上传文件需要知道是谁上传的,上传了什么。所以我们的模型很简单,一个用户名,一个文件名即可。如下app.models.py
from__future__importunicode_literals fromdjango.dbimportmodels #Createyourmodelshere. #UserCLassforuser,usernameanduserimgpath classNormalUser(models.Model): username=models.CharField(max_length=30) headImg=models.FileField(upload_to='./upload') def__unicode__(self): returnself.username classMeta: ordering=['username']
模型创建完成了,接下来我们就赶紧同步一下数据库吧。命令很简单,由于我的Django版本是1.9.6的,所以原来的
pythonmanage.pysyncdb不能用了
我们可以使用下面的命令来代替
pythonmanage.pymakemigrations
pythonmanage.pymigrate
urls.py以及views.py
这两个文件就是为了实现MVC模型的V,C而存在的。
views.py如下:
fromdjango.shortcutsimportrender,render_to_response fromdjangoimportforms fromdjango.httpimportHttpResponse fromapp.modelsimport* #Createyourviewshere. classNormalUserForm(forms.Form): username=forms.CharField() headImg=forms.FileField() defregisterNormalUser(request): ifrequest.method=="POST": uf=NormalUserForm(request.POST,request.FILES) ifuf.is_valid(): #gettheinfooftheform username=uf.cleaned_data['username'] headImg=uf.cleaned_data['headImg'] #writeindatabase normalUser=NormalUser() normalUser.username=username normalUser.headImg=headImg normalUser.save() returnHttpResponse('UploadSucceed!') else: uf=NormalUserForm() returnrender(request,'register.html',{'uf':uf})
urls.py
"""Django_uploadURLConfiguration The`urlpatterns`listroutesURLstoviews.Formoreinformationpleasesee: https://docs.djangoproject.com/en/1.9/topics/http/urls/ Examples: Functionviews 1.Addanimport:frommy_appimportviews 2.AddaURLtourlpatterns:url(r'^$',views.home,name='home') Class-basedviews 1.Addanimport:fromother_app.viewsimportHome 2.AddaURLtourlpatterns:url(r'^$',Home.as_view(),name='home') IncludinganotherURLconf 1.Importtheinclude()function:fromdjango.conf.urlsimporturl,include 2.AddaURLtourlpatterns:url(r'^blog/',include('blog.urls')) """ fromdjango.conf.urlsimporturl fromdjango.contribimportadmin fromapp.viewsimport* urlpatterns=[ url(r'^admin/',admin.site.urls), url(r'^register/$',registerNormalUser), ]
一般来说我们会创建一个超级管理员,命令如下:
pythonmanage.pycreatesuperuser
然后按照相应的提示进行创建就可以了。
设计模板以及表单
其实刚才就可以在views.py中看到一个为NormalUserForm的类,其存在的意义就是方便从request中取得我们需要的表单数据。而且,恐怕你也注意到了,NormalUserForm的字段和NormalUser模型是一样的呢。各中哲理自己品味吧:-)
templates/register.html
<!DOCTYPEhtml> <htmllang="en"> <head> <metacharset="UTF-8"> <title>Register</title> </head> <body> <h2align="center">Register</h2> <formmethod="POST"enctype="multipart/form-data"> {%csrf_token%} {{uf.as_p}} <inputtype="submit"value="Submit"> </form> </body> </html>
这里面比较重要的地方有三点:
•<formmethod="POST"enctype="multipart/form-data">:表单特定的格式,注意上传数据的时候把enctype明确就可以
•{%csrf_token%}:跨域请求,我们需要在表单标签的内部加上这个模板标签,而且要在views.py中配合render而不是render_to_response来实现
•{{uf.as_p}}:使用.as_p方式的话,django就会按照默认的样式在模板页面输出表单的所有的字段。
调试,开启应用
好了,大部分的任务都做好了,下面就打开我们的开发服务器来验证一下吧。
pythonmanage.pyrunserver
打开浏览器输入http://127.0.0.1:8000/register
然后按要求填写表单,就可以了。彩蛋就是加上了is_valid()方法的views.py会自动的帮助我们对表单数据字段进行验证!
打开我们的数据库管理软件,就会发现里面存储的只是路径,而并不是真正的数据。这也体现了大数据存储的核心理念了。点击upload目录,发现文件确实上传成功了!
总结
今天的这个小例子虽然很简单,但是里面也有很多值得我们推敲的地方,我的收获如下。
•使用models.FileField()实现文件上传组件
•对应模型添加一个表单类,字段相同。这样对于表单数据的获取会更加更加的方便。uf=NormalUserForm(request.POST,request.FILES)。
•模板界面表单enctype格式,以及.as_p方式的在html页面上的表单输出
就是这样了!
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。