django 快速实现文件上传(django2.0)

django2.0 快速实现文件上传

本操作环境:

虚拟环境:django2.0 python3.5(应该python3.6都可以使用) window10

1.创建项目与应用(项目和应用都是自己制定的)

创建项目:django-admin startproject FileUpload

然后进入FileUpload文件夹里面 cd FileUpload

在当前目录下面创建一个app应用

python manage.py startapp app

操作顺序如下,workon django2.0,—->这个相当于开启虚拟环境(django2.0是虚拟环境的名称,自己随便定)

F:\益达学习\django\django2.0项目>workon django2.0
(django2.0) F:\益达学习\django\django2.0项目>django-admin startproject fileUpload

(django2.0) F:\益达学习\django\django2.0项目>cd fileUpload

(django2.0) F:\益达学习\django\django2.0项目\fileUpload>python manage.py startapp app

fileUpload文件夹的目录结构如下:查看目录结构的—>tree /f

│  manage.py
│
├─app
│  │  admin.py
│  │  apps.py
│  │  models.py
│  │  tests.py
│  │  views.py
│  │  __init__.py
│  │
│  └─migrations
│          __init__.py
│
└─fileUpload
    │  settings.py
    │  urls.py
    │  wsgi.py
    │  __init__.py
    │
    └─__pycache__
            settings.cpython-35.pyc
            __init__.cpython-35.pyc

打开fileUpload\fileUpload\settings.py文件,将app应用添加进去

# Application definition

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'app',
]

2.设计/修改Model(数据库)

打开fileUpload\app\models.py文件,添加如下内容:

from django.db import models

# Create your models here.
class User(models.Model):
    username = models.CharField(max_length = 30)
    headImg = models.FileField(upload_to= './upload/')
    #所以是用upload_to来指定文件存放的前缀路径

    def __str__(self):
        return self.username

创建两个字段,username**存放用户名,headImg存放上传文件的路径**

生成迁移文件,同步到数据库

python manage.py makemigrations

python manage.py migrate

会在fileUpload\app\migrations文件夹下面多了一些文件出来,自己做的时候可以先打开那个文件夹,执行那个命令的时候观察变化

(django2.0) F:\益达学习\django\django2.0项目\fileUpload>python manage.py makemigrations
Migrations for 'app':
  app\migrations\0001_initial.py
    - Create model User

(django2.0) F:\益达学习\django\django2.0项目\fileUpload>python manage.py migrate
Operations to perform:
  Apply all migrations: admin, app, auth, contenttypes, sessions
Running migrations:
  Applying contenttypes.0001_initial... OK
  Applying auth.0001_initial... OK
  Applying admin.0001_initial... OK
  Applying admin.0002_logentry_remove_auto_add... OK
  Applying app.0001_initial... OK
  Applying contenttypes.0002_remove_content_type_name... OK
  Applying auth.0002_alter_permission_name_max_length... OK
  Applying auth.0003_alter_user_email_max_length... OK
  Applying auth.0004_alter_user_username_opts... OK
  Applying auth.0005_alter_user_last_login_null... OK
  Applying auth.0006_require_contenttypes_0002... OK
  Applying auth.0007_alter_validators_add_error_messages... OK
  Applying auth.0008_alter_user_username_max_length... OK
  Applying auth.0009_alter_user_last_name_max_length... OK
  Applying sessions.0001_initial... OK

3.创建视图(views.py)

①打开fileUpload\app\views.py文件,添加如下内容:

from django.shortcuts import render,render_to_response

# Create your views here.
#函数register里面的形参request是必须要填的
#render()和render_to_response()均是django中用来显示模板页面的

def register(request):
    return render_to_response('register.html',{})

②创建注册页面

先在fileUpload\app目录下创建templates目录,接着在fileUpload\app\templates目录下创建register.html 文件: 这个模板是html5的模板


<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>文件上传title>
head>
<body>
    <h1>registerh1>
body>
html>

③设置模板路径

打开fileUpload\fileUpload\settings.py文件,添加内容关于DIRS:

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR,'templates').replace('\\', '/'),],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

④设置url

打开fileUpload\fileUpload\urls.py文件,添加如下内容:

from django.contrib import admin
from django.urls import path
from app import views

urlpatterns = [
    path('admin/', admin.site.urls),
    path('app/',views.register),
]

⑤启动服务器

python manage.py runserver

(django2.0) F:\益达学习\django\django2.0项目\fileUpload>python manage.py runserver
Performing system checks...

System check identified no issues (0 silenced).
May 08, 2018 - 09:41:29
Django version 2.0.4, using settings 'fileUpload.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CTRL-BREAK.

⑥访问http://127.0.0.1:8000/app/

django 快速实现文件上传(django2.0)_第1张图片
注册页面可以正常打开说明整个过程已经走通。这也是Django开发的基本套路。希望你们一定要熟练理解这个基本套路。

4.完善表单提交

通过上面的过程,我们只是把过程串了起来,我们的register.html 文件,并没有创建用户提交的表单,views.py文件中也并没有对用户提交的信息做处理。下面我们就针对这两个文件进一步的补充。

打开fileUpload\app\template\register.html文件,添加如下内容:

: 表单特定的格式,注意上传数据的时候把enctype明确就可以

{% csrf_token %}: 跨域请求,我们需要在表单标签的内部加上这个模板标签,而且要在views.py中配合render而不是render_to_response来实现

{{ uf.as_p }}: 使用.as_p 方式的话,django就会按照默认的样式在模板页面输出表单的所有的字段。


<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>文件上传title>
head>
<body>
    <h1>registerh1>
    <form action="" method="post" enctype="multipart/form-data">
        {% csrf_token %}
        {{uf.as_p}}
        <input type="submit" value="ok">
    form>
body>
html>

打开fileUpload\app\views.py文件,添加如下内容:

from django.shortcuts import render,render_to_response
from django import forms #重点要导入,使用 Django 的 表单 
from django.http import HttpResponse

# Create your views here.
# 用Form创建一个简单的表单
class UserForm(forms.Form):
    username = forms.CharField()    #字符串
    headImg = forms.FileField()     #文件

#函数register里面的形参request是必须要填的
#render()和render_to_response()均是django中用来显示模板页面的

'''
register函数判断用户的是否为POST请求,如果是并验证是有效的,然后就返回upload ok!,在验证正确和返回OK的中间放我们的上传文件代码,因为只有文件上传成功能返回OK,我们一会说,如果是GET请求,就直接显示一个空表单,让用户输入。
'''
def register(request):
    if request.method == "POST":
        uf = UserForm(request.POST,request.FILES)
        if uf.is_valid():   #判断是否有效
            return HttpResponse('upload ok!')
    else:
        uf = UserForm()
        #返回一个空表单
    return render_to_response('register.html',{'uf':uf})

再次刷新http://127.0.0.1:8000/app/页面(也可以按f5刷新)
django 快速实现文件上传(django2.0)_第2张图片

填写用户名,选择本地上传文件,点击“ok”

会出现一个403的错误,这个错误比较友好,所以不是我们操作过程中的小错误。

django 快速实现文件上传(django2.0)_第3张图片
接着打开fileUpload\fileUpload\settings.py文件,将下面一行代码注释:

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    #'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

再次刷新http://127.0.0.1:8000/app/页面,我们就可以正常将用户名和文件提交了!

5.将数据写入数据库里面

虽然已经实现了数据的提交,但用户名与文件并没有真正的写入到数据库。我们来进一步的完善fileUpload\app\views.py 文件:

from django.shortcuts import render,render_to_response
from django import forms
from django.http import HttpResponse
from app.models import User  #这个记得要写啊

# Create your views here.
class UserForm(forms.Form):
    username = forms.CharField()
    headImg = forms.FileField()

#函数register里面的形参request是必须要填的
#render()和render_to_response()均是django中用来显示模板页面的
#
def register(request):
    if request.method == "POST":
        uf = UserForm(request.POST,request.FILES) #还没有查到是什么意思
        #判断是否为有效的
        if uf.is_valid():
            #获取表单元素
            username = uf.cleaned_data['username']
            headImg = uf.cleaned_data['headImg']
            # 写入数据库
            user = User()
            user.username = username
            user.headImg = headImg
            user.save()
            return HttpResponse('upload ok!')
    else:
        uf = UserForm()
    return render_to_response('register.html',{'uf':uf})

再次刷新http://127.0.0.1:8000/app/页面,实现文件的上传。

django 快速实现文件上传(django2.0)_第4张图片

在项目的目录下,我们发现用户提交的文件(upload下面有文件),前提是按照上面的操作一波

通过在命令行提示符上输入tree /f ,就可以得到整体的目录

│  db.sqlite3
│  manage.py
│
├─app
│  │  admin.py
│  │  apps.py
│  │  models.py
│  │  tests.py
│  │  views.py
│  │  __init__.py
│  │
│  ├─migrations
│  │  │  0001_initial.py
│  │  │  __init__.py
│  │  │
│  │  └─__pycache__
│  │          0001_initial.cpython-35.pyc
│  │          __init__.cpython-35.pyc
│  │
│  ├─templates
│  │      register.html
│  │
│  └─__pycache__
│          admin.cpython-35.pyc
│          models.cpython-35.pyc
│          views.cpython-35.pyc
│          __init__.cpython-35.pyc
│
├─fileUpload
│  │  settings.py
│  │  urls.py
│  │  wsgi.py
│  │  __init__.py
│  │
│  └─__pycache__
│          settings.cpython-35.pyc
│          urls.cpython-35.pyc
│          wsgi.cpython-35.pyc
│          __init__.cpython-35.pyc
│
└─upload
        2.png

6.查看数据库保存的信息

在 Windows 上安装 SQLite

SQLite 基本操作–查看数据表信息

F:\益达学习\django\django2.0项目\fileUpload>sqlite3 db.sqlite3
SQLite version 3.23.1 2018-04-10 17:39:29
Enter ".help" for usage hints.
sqlite> .tables
app_user                    auth_user_user_permissions
auth_group                  django_admin_log
auth_group_permissions      django_content_type
auth_permission             django_migrations
auth_user                   django_session
auth_user_groups
sqlite> select * from app_user;
1|1|upload/2.png
2|1|upload/8.gif
3|1|upload/8_eM2ToMF.gif
4|1|upload/1.png
5|1|upload/1_rosJvBs.png
6|1|upload/2.gif
7|123|upload/2.jpg

网上说通过查看数据库发现,我们数据库中存放的并非用户上传的文件本身,而是文件的存放路径。

当然可以在此基础上进行扩展,比如修改样式,使得界面变得好看点,用户提交成功后,将用户名上传的文件名显示出来等。只要你有想法,一切都可以实现,向着自己的梦想前进。

参考资料:虫师的django快速实现文件上传

你可能感兴趣的:(django)