繁体   English   中英

Django 上传多个文件到动态子文件夹

[英]Django upload multiple files to dynamic subfolder

有没有办法将多个文件上传到动态子文件夹? 我需要像这样创建文件系统:

_uploads
     _incident
          _folder1
              _file1.docx
              _file2.xlsx
          _folder2
              _file1.docx
              _file2.xlsx
              _file3.xlsx

其中上传文件时定义的文件夹名称。 我设法上传了多个文件,但每次它们都保存在事件文件夹中,并且只有 1 个文件保存在子文件夹 folder1/folder2 中。 这些是我的一些代码。

模型.py

from django.db import models


#Create your models here.

def form_directory_path(instance,filename):
    # file will be uploaded to MEDIA_ROOT/<folder_name>/<filename>
    return 'incidents/{0}/{1}'.format(instance.folder_name, filename)
    
class UploadFiles(models.Model):
    folder_name = models.CharField(max_length=40,unique=True)
    files = models.FileField(upload_to=form_directory_path)
    date = models.DateField(auto_now_add=True, blank=True, null=True)

    def __str__(self):
        return f'{self.folder_name} ({self.date})'

Forms.py

from django import forms
from .models import UploadFiles

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

class FileFieldForm(forms.ModelForm):
    class Meta:
        model = UploadFiles
        fields = '__all__'

        widgets = {
            'files': forms.ClearableFileInput(attrs={'multiple': True}),
        }

观点

from django.shortcuts import render
from django.views.generic.edit import FormView
from .forms import FileFieldForm
from .models import UploadFiles

class FileFieldFormView(FormView):
    form_class = FileFieldForm
    template_name = 'upload_files_app/upload.html'  # Replace with your template.
    success_url = 'thankYou/'  # 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('files')    
        if form.is_valid():
            form.save()
            for f in files:  
                file_instance = UploadFiles(files=f)  # Do something with each file.
                file_instance.save()
            return self.form_valid(form)
        else:
            return self.form_invalid(form)

HTML 文件

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Incident declaration</title>
  </head>
  <body>
      <form action="" method="POST" enctype="multipart/form-data">
        {% csrf_token %} {{ form.as_p }}
        <button type="submit">Upload</button>
      </form>
  </body>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM