Django 实现简单的文件上传

来源:互联网 发布:高端保险知乎 编辑:程序博客网 时间:2024/04/28 05:18

今天分享一下Django实现的简单的文件上传的小例子。


步骤

  • 创建Django项目,创建Django应用
  • 设计模型
  • 处理urls.py 以及views.py
  • 设计模板,设计表单
  • 运行项目,查看数据库

    下面我们就一起来分别完成每一个小部分吧。

创建项目和应用

django-admin startproject Django_uploaddjango-admin startapp app

添加一个名为upload的目录,待会要用哦。

然后记得在settings.py 中的INSTALLED_APPS中加上'app',。注意那个小逗号就行了~~

设计模型

上传文件需要知道是谁上传的,上传了什么。所以我们的 模型很简单,一个用户名,一个文件名即可。如下app.models.py

from __future__ import unicode_literalsfrom django.db import models# Create your models here.# User CLass for user,username and userimg pathclass 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 makemigrationspython manage.py migrate

urls.py 以及 views.py

这两个文件就是为了实现MVC模型的V,C而存在的。
views.py 如下:

from django.shortcuts import render,render_to_responsefrom django import formsfrom django.http import HttpResponsefrom 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

"""Django_upload URL ConfigurationThe `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 urlfrom django.contrib import adminfrom 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

<!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页面上的表单输出

    就是这样了!

0 0