Python+django实现简单的文件上传


Posted in Python onAugust 17, 2016

今天分享一下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

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 如下:

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

"""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

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

就是这样了!

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python和pyqt实现360的CLable控件
Feb 21 Python
Python实现简单登录验证
Apr 13 Python
安装Python的教程-Windows
Jul 22 Python
Python有序字典简单实现方法示例
Sep 28 Python
Django admin实现图书管理系统菜鸟级教程完整实例
Dec 12 Python
python json.loads兼容单引号数据的方法
Dec 19 Python
twilio python自动拨打电话,播放自定义mp3音频的方法
Aug 08 Python
Pycharm 2020最新永久激活码(附最新激活码和插件)
Sep 17 Python
python_mask_array的用法
Feb 18 Python
python GUI库图形界面开发之PyQt5动态(可拖动控件大小)布局控件QSplitter详细使用方法与实例
Mar 06 Python
opencv+pyQt5实现图片阈值编辑器/寻色块阈值利器
Nov 13 Python
python3读取文件指定行的三种方法
May 24 Python
Python Django使用forms来实现评论功能
Aug 17 #Python
小小聊天室Python代码实现
Aug 17 #Python
python如何在终端里面显示一张图片
Aug 17 #Python
动感网页相册 python编写简单文件夹内图片浏览工具
Aug 17 #Python
Python入门教程之运算符与控制流
Aug 17 #Python
python 循环while和for in简单实例
Aug 16 #Python
Python自动化测试ConfigParser模块读写配置文件
Aug 15 #Python
You might like
yii去掉必填项中星号的方法
2015/12/28 PHP
购物车实现的几种方式优缺点对比
2018/05/02 PHP
laravel 获取当前url的别名方法
2019/10/11 PHP
一个用javascript写的select支持上下键、首字母筛选以及回车取值的功能
2009/09/09 Javascript
7个Javascript地图脚本整理
2009/10/20 Javascript
[原创]js获取数组任意个不重复的随机数组元素
2010/03/15 Javascript
按给定几率进行随机抽取的js代码
2010/12/28 Javascript
jquery中交替点击事件的实现代码
2014/02/14 Javascript
Jquery实现仿京东商城省市联动菜单
2015/11/19 Javascript
jQuery仿IOS弹出框插件
2017/02/18 Javascript
iconfont的三种使用方式详解
2018/08/05 Javascript
解决vue打包后vendor.js文件过大问题
2019/07/03 Javascript
JS猜数字游戏实例讲解
2020/06/30 Javascript
在vue中实现给每个页面顶部设置title
2020/07/29 Javascript
JavaScript数组类型Array相关的属性与方法详解
2020/09/08 Javascript
[03:06]3分钟带你回顾DOTA2完美盛典&完美大师赛
2017/12/06 DOTA
[46:47]完美世界DOTA2联赛PWL S2 FTD vs Magma 第二场 11.20
2020/11/23 DOTA
跟老齐学Python之一个免费的实验室
2014/09/14 Python
Python中每次处理一个字符的5种方法
2015/05/21 Python
Django中数据库的数据关系:一对一,一对多,多对多
2018/10/21 Python
Python类和对象的定义与实际应用案例分析
2018/12/27 Python
详解Python基础random模块随机数的生成
2019/03/23 Python
Python中xml和dict格式转换的示例代码
2019/11/07 Python
html5拍照功能实现代码(htm5上传文件)
2013/12/11 HTML / CSS
HTML5 Convas APIs方法详解
2015/04/24 HTML / CSS
PacSun官网:加州生活方式服装、鞋子和配饰
2018/03/10 全球购物
优秀的自荐信要注意哪些
2014/01/03 职场文书
《自然之道》教学反思
2014/02/11 职场文书
大学生自我评价范文分享
2014/02/21 职场文书
如何写好自荐信
2014/04/07 职场文书
党员承诺书范文2015
2015/04/27 职场文书
高中生军训感言
2015/08/01 职场文书
2019银行员工个人工作自我鉴定
2019/06/27 职场文书
如何撰写促销方案?
2019/07/05 职场文书
《成长的天空》读后感3篇
2019/12/06 职场文书
JavaScript流程控制(分支)
2021/12/06 Javascript