django 实现文件上传

创建项目与应用    

django-admin.py startproject mysite
cd mysite
python manage.py startapp app01

打开mysite/mysite/settings.py文件,将app01应用添加进去:

INSTALLED_APPS = [
    ‘django.contrib.admin‘,
    ‘django.contrib.auth‘,
    ‘django.contrib.contenttypes‘,
    ‘django.contrib.sessions‘,
    ‘django.contrib.messages‘,
    ‘django.contrib.staticfiles‘,
    "app01",
]

设计Model(数据库)    

打开mysite/app01/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/‘)    
    def __unicode__(self):        
        return self.username

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

下面进行数据库的同步

    python manage.py makemigrations
  python manage.py migrate

最后生成的 app01_user 表就我是我们models.py 中所创建的类。Django 提供了他们之间的对应关系。

创建视图      

1、打开mysite/app01/views.py 文件

from django.shortcuts 
import render,render_to_response
# Create your views here.
def register(request):
    return render_to_response(‘register.html‘,{})

2、创建注册页面

先在mysite/app01/目录下创建templates目录,接着在mysite/app01/templates/目录下创建register.html 文件:

<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"><head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    <title></title></head><body><h1>register</h1></body></html>

3、设置模板路径

打开mysite/mysite/settings.py文件,在底部添加:

#template
TEMPLATE_DIRS = (
    os.path.join(BASE_DIR, ‘templates‘),
    os.path.join(BASE_DIR, ‘app01/templates‘),
)

4、设置URL

from django.conf.urls import url,include
from django.contrib import admin
from app01 import views as app01
urlpatterns = [

    
    url(r‘^file/‘, app01.register),

]

5、启动服务

python manage.py runserver 0.0.0.0:8000

Performing system checks...

System check identified some issues:

WARNINGS:
?: (1_8.W001) The standalone TEMPLATE_* settings were deprecated in Django 1.8 and the TEMPLATES dictionary takes precedence. You must put the values of the following settings into your default TEMPLATES dict: TEM
PLATE_DIRS.

System check identified 1 issue (0 silenced).
August 31, 2016 - 10:55:12
Django version 1.10, using settings ‘sitename.settings‘
Starting development server at http://0.0.0.0:8000/
Quit the server with CTRL-BREAK.

6、访问http://127.0.0.1:8000/file

注册页面可以正常打开说明整个过程已经走通


完善表单提交             

打开mysite/app01/templates/register.html 文件:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>register</title>
</head>
<body>
     <h1>register</h1>
    <form method="post" enctype="multipart/form-data" >
    {{uf.as_p}}
    <input type="submit" value="ok"/>
        </form>
</body>
</html>

打开mysite/app01/views.py 文件:

from django.shortcuts import render,render_to_response
from django import forms
from django.http import HttpResponse
# Create your views here.

class UserForm(forms.Form):
    username = forms.CharField()
    headImg = forms.FileField()

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})

再次刷新页面

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

抛出一个错误,解决方法如下。

打开mysite/mysite/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‘,
]

再次刷新网页:

将数据写入数据库         

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

#coding:utf-8
from django.shortcuts import render,HttpResponse,render_to_response
import datetime,os

# Create your views here.
from django import template
from sitename import settings
import sys
import locale

from django import forms
from app01.models import User
class UserForm(forms.Form):
    username = forms.CharField()
    headImg = forms.FileField()
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})

再次刷新页面,完成文件的上传。

在项目的目录下,我们发现了用户提交的文件。

那数据库中保存的是什么呢?

mysql> select * from app01_user;
+----+----------+------------------+
| id | username | headImg          |
+----+----------+------------------+
|  1 | alex     | upload/store.png |
|  2 | jwh      | upload/store.png |
+----+----------+------------------+
2 rows in set (0.02 sec)

mysql>

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

时间: 2024-12-07 14:54:10

django 实现文件上传的相关文章

python Django之文件上传

python Django之文件上传 使用Django框架进行文件上传共分为俩种方式 一.方式一 通过form表单进行文件上传 #=========================================FORM表单上传文件======================================== def f1(request): #定义f1上传函数 if request.method=='GET': #如果是以GET请求 return render(request,'f1.htm

框架----Django之文件上传

一.文件上传 1. 浏览器访问 http://127.0.0.1:8000/f1/ http://127.0.0.1:8000/f2/ 2. urls from django.conf.urls import url from django.contrib import admin from app01 import views urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^f1/', views.f1), url(r'^f2/

django的文件上传&amp;JsonResponse的使用&amp;数据库的连接

1 request对象 method:请求方式 GET:get请求的参数(post请求,也可以携带参数) POST:post请求的参数(本质是从bdoy中取出来,放到里面了) COOKIES: META:字典(放着好多东西,前端传过来的,一定能从其中拿出来) body:post提交的数据 path:请求的路径,不带参数 request.get_full_path() 请求路径,带参数 session: user: FILES encoding:编码格式 is_ajax(): 2 HttpResp

十、Django的文件上传

一.上传文件相关 请求头ContentType ContentType指的是请求体的编码类型,常见的类型共有3种: application/x-www-form-urlencoded 最常见的 POST 提交数据的方式了 浏览器的原生 form 表单,如果不设置?enctype?属性,那么最终就会以 默认格式application/x-www-form-urlencoded 方式提交数据,ajax默认也是这个 urlencoded是一种数据格式, 比如: username=yang&passwo

Django普通文件上传

前端代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script src="/static/jquery-3.2.1.min.js"></script> <script src="/static/jquery

Django处理文件上传File Uploads

HttpRequest.FILES 表单上传的文件对象存储在类字典对象request.FILES中,表单格式需为multipart/form-data <form enctype="multipart/form-data" method="post" action="/foo/"> <input type="file" name="image" /> request.FILES中的键

django 的文件上传

template html(模板文件): <form enctype="multipart/form-data" method="POST" action="/address/upload/"> <input type="file" name="file" /> <br /> <input type="submit" value="上传

django实现文件上传(最简单的方法)

html页面代码: <!DOCTYPE html> <html lang="en"> <head>     <meta charset="UTF-8">     <title>Title</title> </head> <body>     <form enctype="multipart/form-data" action="/app

django里面文件上传处理处理

最近,写一个上次文件的django.死活传不过去. 在大神的帮助下面,最终还是成. 不过也发现一个问题: django 官网文档:https://docs.djangoproject.com/en/1.8/topics/http/file-uploads/ 表单定义 class UploadFileForm(forms.Form):     title = forms.CharField(max_length=50)     file = forms.FileField() 表单对象生成. fo