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中将阿拉伯数字转换成中文的实现代码
May 19 Python
Python实现遍历windows所有窗口并输出窗口标题的方法
Mar 13 Python
Python连接DB2数据库
Aug 27 Python
利用selenium 3.7和python3添加cookie模拟登陆的实现
Nov 20 Python
Python面向对象基础入门之设置对象属性
Dec 11 Python
python读取文件名并改名字的实例
Jan 07 Python
python3.6 tkinter实现屏保小程序
Jul 30 Python
自适应线性神经网络Adaline的python实现详解
Sep 30 Python
Django filter动态过滤与排序实现过程解析
Nov 26 Python
python dir函数快速掌握用法技巧
Dec 09 Python
Python基于mediainfo批量重命名图片文件
Dec 29 Python
Python内置数据类型中的集合详解
Mar 18 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
php 之 没有mysql支持时的替代方案
2006/10/09 PHP
PHP中的integer类型使用分析
2010/07/27 PHP
PHP header函数分析详解
2011/08/06 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(一)
2014/06/23 PHP
PHP常用的三种设计模式汇总
2016/08/28 PHP
php实现微信公众号创建自定义菜单功能的实例代码
2019/06/11 PHP
PHP MVC框架中类的自动加载机制实例分析
2019/09/18 PHP
javascript 用记忆函数快速计算递归函数
2010/03/15 Javascript
jQuery实现的类flash菜单效果代码
2010/05/17 Javascript
指定位置如果有图片显示图片,无图片显示广告的JS
2010/06/05 Javascript
JS随即打乱数组实现代码
2012/12/03 Javascript
自己写的兼容ie和ff的在线文本编辑器类似ewebeditor
2012/12/12 Javascript
jquery中prop()方法和attr()方法的区别浅析
2013/09/06 Javascript
jQuery事件绑定用法详解(附bind和live的区别)
2016/01/19 Javascript
node.js cookie-parser之parser.js
2016/06/06 Javascript
BootStrap日期控件在模态框中选择时间下拉菜单无效的原因及解决办法(火狐下不能点击)
2016/08/18 Javascript
jquery实现瀑布流效果 jquery下拉加载新数据
2016/12/12 Javascript
全面解析Node.js 8 重要功能和修复
2017/06/02 Javascript
AngularJS 验证码60秒倒计时功能的实现
2017/06/05 Javascript
简述ES6新增关键字let与var的区别
2019/08/23 Javascript
JavaScript实现雪花飘落效果
2020/12/27 Javascript
python中常用的各种数据库操作模块和连接实例
2014/05/29 Python
Python处理Excel文件实例代码
2017/06/20 Python
Python中矩阵库Numpy基本操作详解
2017/11/21 Python
Python常见字符串操作函数小结【split()、join()、strip()】
2018/02/02 Python
Tensorflow 合并通道及加载子模型的方法
2018/07/26 Python
Django框架orM与自定义SQL语句混合事务控制操作
2019/06/27 Python
Python3将数据保存为txt文件的方法
2019/09/12 Python
python GUI库图形界面开发之PyQt5开发环境配置与基础使用
2020/02/25 Python
详解Python中pyautogui库的最全使用方法
2020/04/01 Python
关于HTML5+ API plusready的兼容问题
2020/11/20 HTML / CSS
Expedia爱尔兰:酒店、机票、租车及廉价假期
2017/01/02 全球购物
The Beach People美国:澳洲海滨奢华品牌
2018/07/05 全球购物
故意伤害辩护词
2015/05/21 职场文书
Ajax实现局部刷新的方法实例
2021/03/31 Javascript
python 制作一个gui界面的翻译工具
2021/05/14 Python