今天分享一下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页面上的表单输出

    就是这样了!

Django 实现简单的文件上传的更多相关文章

  1. 服务器文档下载zip格式 SQL Server SQL分页查询 C#过滤html标签 EF 延时加载与死锁 在JS方法中返回多个值的三种方法(转载) IEnumerable,ICollection,IList接口问题 不吹不擂,你想要的Python面试都在这里了【315+道题】 基于mvc三层架构和ajax技术实现最简单的文件上传 事件管理

    服务器文档下载zip格式   刚好这次项目中遇到了这个东西,就来弄一下,挺简单的,但是前台调用的时候弄错了,浪费了大半天的时间,本人也是菜鸟一枚.开始吧.(MVC的) @using Rattan.Co ...

  2. 使用jsp/servlet简单实现文件上传与下载

    使用JSP/Servlet简单实现文件上传与下载    通过学习黑马jsp教学视频,我学会了使用jsp与servlet简单地实现web的文件的上传与下载,首先感谢黑马.好了,下面来简单了解如何通过使用 ...

  3. DVWA靶机--简单的文件上传漏洞

    简单的文件上传漏洞(靶机安全级别:low) 事先准备好一句话木马,密码为pass 上传一句话木马,显示上传路径(一般网站是不会显示路径的,这里靶机为了方便你测试漏洞,直接显示出了路径: ../../h ...

  4. Java实现一个简单的文件上传案例

    Java实现一个简单的文件上传案例 实现流程: 1.客户端从硬盘读取文件数据到程序中 2.客户端输出流,写出文件到服务端 3.服务端输出流,读取文件数据到服务端中 4.输出流,写出文件数据到服务器硬盘 ...

  5. java 网络编程之TCP通信和简单的文件上传功能

    */ .hljs { display: block; overflow-x: auto; padding: 0.5em; color: #333; background: #f8f8f8; } .hl ...

  6. struts2中简单的文件上传

    2016-08-31 一.       文件上传 利用commons-fileupload-1.2.1.jar实现简单的上传文件,首先在页面上填写表单,记得加上enctype="multip ...

  7. nodejs 实现简单的文件上传功能

    首先需要大家看一下目录结构,然后开始一点开始我们的小demo. 文件上传总计分为三种方式: 1.通过flash,activeX等第三方插件实现文件上传功能. 2.通过html的form标签实现文件上传 ...

  8. springboot实现简单的文件上传

    承接上一篇,这里记录一下简单的springboot文件上传的方式 首先,springboot简单文件上传不需要添加额外的jar包和配置 这里贴一下后端controller层的实现代码 补一份前台的HT ...

  9. 简单的文件上传的下载(动态web项目)

    1.在页面中定义一个form表单,如下: <!-- 文件上传 --> <form action="${pageContext.request.contextPath}/Fi ...

随机推荐

  1. Evensgn 的债务

    问题 A: Evensgn 的债务 大致题意:a欠b5元,b欠c5元,那么最小债务总额为a欠c5元,给你关系,求最小债务总额! 不想说话...一句超级大水题,我居然没读懂!!差点想到网络流了...其实 ...

  2. 【BZOJ1483】【HNOI2009】梦幻布丁

    题意:n个连续的点,有若干种颜色,每个颜色会因为某些操作变为另一种颜色,动态查询颜色段数. 解题思路:对每个颜色开一棵平衡树启发式合并应该是最裸的想法,但是我们有更优的! 考虑对每个颜色利用链表储存它 ...

  3. 51Nod 1555 布丁怪

    题目描述: 布丁怪这一款游戏是在一个n×n 的矩形网格中进行的,里面有n个网格有布丁怪,其它的一些格子有一些其它的游戏对象.游戏的过程中是要在网格中移动这些怪物.如果两个怪物碰到了一起,那么他们就会变 ...

  4. 【Toll!Revisited(uva 10537)】

    题目来源:蓝皮书P331 ·这道题使得我们更加深刻的去理解Dijkstra!       在做惯了if(dis[u]+w<dis[v])的普通最短路后,这道选择路径方案不是简单的比大小的题横在了 ...

  5. 【uva 1411 Ants蚂蚁们】

    题目大意: ·给你一个n,表示输入n个白点和n个黑点(输入每一个点的坐标).现在需要将各个白点和各个黑点一一用线段连接起来,需要满足这些线段不能够相交. ·特色: 我们如何保证线段间不相交. ·分析: ...

  6. HNOI2002 营业额统计(Splay Tree)

    题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1588 题意: Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并 ...

  7. NTT+多项式求逆+多项式开方(BZOJ3625)

    定义多项式$h(x)$的每一项系数$h_i$,为i在c[1]~c[n]中的出现次数. 定义多项式$f(x)$的每一项系数$f_i$,为权值为i的方案数. 通过简单的分析我们可以发现:$f(x)=\fr ...

  8. SpringCache学习之操作redis

    一.redis快速入门 1.redis简介 在java领域,常见的四大缓存分别是ehcache,memcached,redis,guava-cache,其中redis与其他类型缓存相比,有着得天独厚的 ...

  9. MySQL DATE_SUB()

    DATE_SUB(date,INTERVAL expr type) 函数从日期减去指定的时间间隔. date 参数是合法的日期表达式.expr 参数是您希望添加的时间间隔. type 参数可以是下列值 ...

  10. 忘记Jenkins管理员密码的解决办法

    一.admin密码未更改情况 1.进入\Jenkins\secrets目录,打开initialAdminPassword文件,复制密码: 2.访问Jenkins页面,输入管理员admin,及刚才的密码 ...