Python+django实现简单的文件上传
作者:Marksinoberg 发布时间:2021-08-15 03:11:25
今天分享一下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的数据类型:int和str。再强调一下对数据类型的理解,这个世界是由数据组成的,数据可能是数字(
- 一、前言当我们在django中添加或修改了数据库model后,一般需要执行makemigrations、migrate把我们的model类生
- 在Navicat中,时间戳(timestamp)格式的数据表现为:查询某一天的数据SELECT * FROM my_tableWHERE `
- 1、先来看看为什么会出锁住: 数据库是一个多用户使用的共享资源。当多个用户并发地存取数据时,在数据库中就
- ID3决策树是以信息增益作为决策标准的一种贪心决策树算法# -*- coding: utf-8 -*-from numpy import *
- 根据一个爬取豆瓣电影排名的小应用,来简单使用etree和request库。etree使用xpath语法。import requestsimp
- mysql4.1以上版本连接时出现Client does not support authentic
- 正态分布(Normal distribution)又成为高斯分布(Gaussian distribution)若随机变量X服从一个数学期望为
- 本文实例讲述了Python网络编程之TCP套接字简单用法。分享给大家供大家参考,具体如下:上学期学的计算机网络,因为之前还未学习python
- 创建工程时,选择已存在的环境(不要选择虚拟环境,虽然安全,但很慢)添加环境在 anaconda3/bin/python3.6 即 d:/an
- 安装py2app打开终端输入pip3命令安装py2app工具pip3 install py2pp安装完成后,默认会装到/Library/Fr
- 目录0. 前言1. ipaddress模块介绍1.1 IP主机地址1.2 定义网络1.3 主机接口1.4 检查address/network
- 1.保存变量先创建(在tf.Session()之前)saversaver = tf.train.Saver(tf.global_variab
- (一) 常用的CSS命名规则:头:header内容:content/container尾:footer导航:nav侧栏:sidebar栏目:
- 本文实例讲述了JavaScript字符串对象(string)基本用法。分享给大家供大家参考,具体如下:1.获取字符串的长度:var s =
- Celery是Python开发分布式任务列队的处理库。可以异步分布式地异步处理任务,也可定时执行任务等等。通常我们可以使用celery在Dj
- 在很多语言的学习中,“事件”都是一个比较难理解,但是又是一个很重要的概念。javascript中的事件处理也是一样,正因为有了事件处理,才会
- 前言本文是在GitHub上看到一个大牛总结的前端常见面试题,很多问题问的都很好,很经典、很有代表性。上面没有答案,我就整理了一下,从网上找了
- zhanglunray 问:我在mzzx_pic这个层设置了左边距,在ie里显示是正常的,但是在ff里显示时margin-left却没有起到
- 一、概论超大型系统的特点为:1、处理的用户数一般都超过百万,有的还超过千万,数据库的数据量一般超过1TB;2、系统必须提供实时响应功能,系统