zoukankan      html  css  js  c++  java
  • Django——文件上传

    Django在处理文件上传时,文件数据被打包封装在request.FILES中。

    一、简单上传

    首先,在模型中创建表格,它必须包含一个FileField:

    # models.py
    from django import forms
    
    
    class UploadFile(forms.Form):
        file = forms.FileField()

    处理这个表单的视图将在request.FILES中收到文件数据,可以用request.FILES['file']来获取上传文件的具体数据,其中的键值‘file’是根据 file = forms.FileField()的变量名来的。

    注意:request.FILES只有在请求方法为POST,并且提交请求的<form>具有enctype="multipart/form-data"属性时才有效。 否则,request.FILES将为空。

    前端的html可以这样写:

    <!-- upload.html -->
    
    <!-- .....省略 -->
    <body>
    <form action="{% url 'upload' %}" method="post" enctype="multipart/form-data">
        {% csrf_token %}
        {{ form }}
        <input type="submit" value="提交">
    </form>
    </body>
    <!-- .....省略 -->

    对应的URLconf为:

    # urls.py
    
    
    from django.contrib import admin
    from django.urls import path
    from app01 import views
    
    urlpatterns = [
        path('admin/', admin.site.urls),
        path('upload/', views.upload, name='upload'),
    ]

    下面是一个接收上传文件的视图范例:

    # views.py
    
    from django.http import HttpResponse
    from django.shortcuts import render
    from .models import UploadFile
    import os
    
    
    def upload_file(request):
        if request.method == 'POST':
            form = UploadFile(request.POST, request.FILES) # 注意获取数据的方式
            if form.is_valid():
                name = request.FILES['file'].name   # 获取文件名
                file_path = os.path.join('app01/image', name)   # 需手动创建image文件夹
                with open(file_path, 'wb+') as destination:
                     for chunk in request.FILES['file'].chunks():
                     destination.write(chunk)
                return HttpResponse('ok')
        else:
            form = UploadFile()
        return render(request, 'upload.html', {'form': form})

    请注意,必须将request.FILES传递到form的构造函数中。

     form = UploadFile(request.POST, request.FILES) 

    遍历UploadedFile.chunks(),而不是直接使用read()方法,能确保大文件不会占用系统过多的内存。

    二、 使用模型处理上传的文件

    如果是通过模型层的model来指定上传文件的保存方式的话,使用ModelForm更方便。 调用form.save()的时候,文件对象会保存在相应的FileField的upload_to参数指定的地方。

    首先

    # models.py
    
    from django.db import models
    from django import forms
    
    
    class Edit(models.Model):
        image = models.FileField(upload_to='delete/image')
    
    
    class EditForm(forms.ModelForm):
    
        class Meta:
            fields = "__all__"
            model = Edit

    然后前端的html差不多:

    <!-- upload.html -->
    
    <!-- .....省略 -->
    <body>
    <form action="{% url 'index' %}" method="post" enctype="multipart/form-data">
        {% csrf_token %}
        {{ form }}
        <input type="submit" value="提交">
    </form>
    </body>
    <!-- .....省略 -->

    以及对应的URLconf为:

    from django.contrib import admin
    from django.urls import path
    from app01 import views
    
    urlpatterns = [
        path('admin/', admin.site.urls),
        path('index/', views.index, name='index'),
    ]

    最后是试图views.py

    from django.http import HttpResponseRedirect
    from django.shortcuts import render
    from .forms import ModelFormWithFileField
    
    def index(request):
        if request.method == 'POST':
            form = EditForm(request.POST, request.FILES)
            if form.is_valid():
    # 这么做就可以了,文件会被保存到Model中upload_to参数指定的位置
                form.save()
                return HttpResponse('ok')
        else:
            form = EditForm()
        return render(request, 'index.html', {'form': form})
     
    终日不为以思,无益,不如学也
  • 相关阅读:
    强关联二维材料1T—TaS2晶体
    超薄二维Mo2C晶体
    稀有的二维狄拉克材料
    大自然中的几何植物
    字符串的内建函数
    python数据模型(特殊方法)
    插入排序
    下载谷歌浏览器(Chrome)扩展离线安装包crx文件最简单的方法
    33. 高精度练习之乘法
    32. 整数加法
  • 原文地址:https://www.cnblogs.com/lymlike/p/11426325.html
Copyright © 2011-2022 走看看