日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢(xún)
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
創(chuàng)新互聯(lián)Django4.0教程:Django4.0文件上傳-簡(jiǎn)單文件上傳

考慮一個(gè)包含 ?FileField ?的表單:

from django import forms

class UploadFileForm(forms.Form):
    title = forms.CharField(max_length=50)
    file = forms.FileField()

處理這個(gè)表單的視圖將在 ?request.FILES? 中接收文件數(shù)據(jù),它是一個(gè)字典,包含表單中每個(gè) ?FileField ?(或 ?ImageField?,或其他 ?FileField ?子類(lèi))的鍵。所以上述表單中的數(shù)據(jù)將以 ?request.FILES['file']? 的形式被訪問(wèn)。
注意 ?request.FILES? 只有當(dāng)請(qǐng)求方法是 ?POST?,至少有一個(gè)文件字段被實(shí)際發(fā)布,并且發(fā)布請(qǐng)求的 ?

? 有 ?enctype="multipart/form-data"? 屬性時(shí),才會(huì)包含數(shù)據(jù)。否則 ?request.FILES? 將為空。
大多數(shù)情況下,你需要像將上傳的文件綁定到表單中 里描述的那樣將文件數(shù)據(jù)從 ?request ?傳遞給表單。示例如下:

from django.http import HttpResponseRedirect
from django.shortcuts import render
from .forms import UploadFileForm

# Imaginary function to handle an uploaded file.
from somewhere import handle_uploaded_file

def upload_file(request):
    if request.method == 'POST':
        form = UploadFileForm(request.POST, request.FILES)
        if form.is_valid():
            handle_uploaded_file(request.FILES['file'])
            return HttpResponseRedirect('/success/url/')
    else:
        form = UploadFileForm()
    return render(request, 'upload.html', {'form': form})

注意我們必須將 ?request.FILES? 傳入到表單的 構(gòu)造方法中,只有這樣文件數(shù)據(jù)才能綁定到表單中。
我們通??赡芟襁@樣處理上傳文件:

def handle_uploaded_file(f):
    with open('some/file/name.txt', 'wb+') as destination:
        for chunk in f.chunks():
            destination.write(chunk)

使用 ?UploadedFile.chunks()? 而不是 ?read()? 是為了確保即使是大文件也不會(huì)將我們系統(tǒng)的內(nèi)存占滿(mǎn)。

通過(guò)模板來(lái)處理上傳的文件

如果想要在 ?FileField ?上的 ?Model ?保存文件,使用 ?ModelForm ?會(huì)讓這一過(guò)程變得簡(jiǎn)單。當(dāng)調(diào)用 ?form.save()? 時(shí),文件對(duì)象將會(huì)被保存在對(duì)相應(yīng) ?FileField ?的 ?upload_to ?參數(shù)所指定的地方:

from django.http import HttpResponseRedirect
from django.shortcuts import render
from .forms import ModelFormWithFileField

def upload_file(request):
    if request.method == 'POST':
        form = ModelFormWithFileField(request.POST, request.FILES)
        if form.is_valid():
            # file is saved
            form.save()
            return HttpResponseRedirect('/success/url/')
    else:
        form = ModelFormWithFileField()
    return render(request, 'upload.html', {'form': form})

如果你準(zhǔn)備手工構(gòu)建對(duì)象,你可以指定來(lái)自 ?request.FILES? 的文件對(duì)象到模型里的文件對(duì)象:

from django.http import HttpResponseRedirect
from django.shortcuts import render
from .forms import UploadFileForm
from .models import ModelWithFileField

def upload_file(request):
    if request.method == 'POST':
        form = UploadFileForm(request.POST, request.FILES)
        if form.is_valid():
            instance = ModelWithFileField(file_field=request.FILES['file'])
            instance.save()
            return HttpResponseRedirect('/success/url/')
    else:
        form = UploadFileForm()
    return render(request, 'upload.html', {'form': form})

如果您在請(qǐng)求之外手動(dòng)構(gòu)建對(duì)象,則可以將類(lèi)似文件的對(duì)象分配給 ?FileField?:

from django.core.management.base import BaseCommand
from django.core.files.base import ContentFile

class MyCommand(BaseCommand):
    def handle(self, *args, **options):
        content_file = ContentFile(b'Hello world!', name='hello-world.txt')
        instance = ModelWithFileField(file_field=content_file)
        instance.save()

上傳多個(gè)文件

如果你想使用一個(gè)表單字段上傳多個(gè)文件,則需要設(shè)置字段的 ?widget的 ?multiple HTML? 屬性。

from django import forms

class FileFieldForm(forms.Form):
    file_field = forms.FileField(widget=forms.ClearableFileInput(attrs={'multiple': True}))

然后覆蓋 ?FormView ?子類(lèi)的 ?post ?方法來(lái)控制多個(gè)文件上傳:

from django.views.generic.edit import FormView
from .forms import FileFieldForm

class FileFieldFormView(FormView):
    form_class = FileFieldForm
    template_name = 'upload.html'  # Replace with your template.
    success_url = '...'  # Replace with your URL or reverse().

    def post(self, request, *args, **kwargs):
        form_class = self.get_form_class()
        form = self.get_form(form_class)
        files = request.FILES.getlist('file_field')
        if form.is_valid():
            for f in files:
                ...  # Do something with each file.
            return self.form_valid(form)
        else:
            return self.form_invalid(form)

分享題目:創(chuàng)新互聯(lián)Django4.0教程:Django4.0文件上傳-簡(jiǎn)單文件上傳
URL地址:http://www.dlmjj.cn/article/dpocicp.html