之前参考了虫师和纯臻对此的实践博文,但是由于版本迭代问题,最新版本的Django命令已经修改了,我重新完成一份攻略。
目录:
django-admin startproject Django_upload
cd Django_upload
django-admin startapp app
在 Django_upload/settings.py 中的INSTALLED_APPS中加上'app',
。注意要有小逗号,如下:
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'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.11.2的,所以原来虫师写的命令不可以用了。
Python manage.py syncdb不能用了
改为:
python manage.py makemigrations
python manage.py migrate
这两个文件就是为了实现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为:
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),
]
一般来说我们会创建一个超级管理员,命令如下:这里纯臻的在1.9的 命令也不可以用了,要换下。
python manage.py createduperuser 不可用
改为:
python manage.py createduperuser
其实刚才就可以在views.py中看到一个为NormalUserForm的类,其存在的意义就是方便从请求中取得我们需要的表单数据。而且,恐怕你也注意到了,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明确就可以好了,大部分的任务都做好了,下面就打开我们的开发服务器来验证一下吧。
python manage.py runserver
打开浏览器输入
http://127.0.0.1:8000/register
然后按要求填写表单,就可以了。彩蛋就是加上了is_valid()方法的views.py会自动的帮助我们对表单数据字段进行验证!
打开我们的数据库管理软件,就会发现里面存储的只是路径,而并不是真正的数据。也。这体现了大数据存储的核心理念了。点击上传目录,发现文件确实上传成功了!
参考博客:
原创文章,转载请注明: 转载自URl-team
本文链接地址: 用django1.11.2版本实现文件上传demo