zoukankan      html  css  js  c++  java
  • django fileup-load

    文件上传

    使用form表单类的上传

    forms.py
    
    from django import forms
    
    class UploadFileForm(forms.Form):
        title = forms.CharField(max_length=50)
        file = forms.FileField()
    

    view处理这个form将会从request.FILES中接收file data,它是一个包含所有表单中FileField、ImageField和其他FileField的子类的字典,获取某个文件用request.FILES['filename']

    注:上传文件的form表单必须是POST method,并且enctyoe="ultipart/form-data"。否则request.FILES将为空。

    大多数情况下,您只需将文件数据从请求传递到表单,就像绑定上传文件到表单中所描述的那样。例如:

    views.py
    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})
    
    
    # 上传文件
    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()可以确保大文件不会淹没系统的内存。

    Handling uploaded files with a model

    # models.py
    
    from django.contrib.auth.models import AbstractUser
    
    
    class UserInfo(AbstractUser):
    	nid = models.AutoField(primary_key=True)
        telephone = models.CharField(max_length=11, null=True, unique=True)
        avatar = models.FileField(upload_to='avatars/', default="avatars/default.png")
    

    # forms.py
    

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

    多文件上传

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

    重写FormView

    # views.py
    
    from django.views.generic.edit import FormView
    from .forms import FileFieldForm
    
    class FileFieldView(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)
  • 相关阅读:
    PAT (Advanced Level) Practice 1054 The Dominant Color (20 分)
    PAT (Advanced Level) Practice 1005 Spell It Right (20 分) (switch)
    PAT (Advanced Level) Practice 1006 Sign In and Sign Out (25 分) (排序)
    hdu 5114 Collision
    hdu4365 Palindrome graph
    单链表查找最大值、两个递增的链表合并并且去重
    蓝桥杯-最短路 (SPFA算法学习)
    蓝桥杯-最大最小公倍数
    Codeforces-470 div2 C题
    蓝桥杯-地宫取宝
  • 原文地址:https://www.cnblogs.com/LTEF/p/9736822.html
Copyright © 2011-2022 走看看