在 Django 中使用 view/form 上传多个文件
Use view/form in Django to upload a multiple files
下面的Class用于在Django中创建表单并获取必要的信息。问题是,它只提供一个文件上传。我需要上传多个文件。我用脆皮表格。
我的简化 view.py 看起来像:
class PostCreateView(LoginRequiredMixin, CreateView):
model = Post
fields = ['title', 'file_1']
def form_valid(self, form):
form.instance.author = self.request.user
return super().form_valid(form)
HTML代码:
{% extends "blog/base.html" %}
{% load crispy_forms_tags %}
{% block content %}
<div class="content-section">
<form method="POST" enctype="multipart/form-data">
{% csrf_token %}
<fieldset class="form-group">
<legend class="border-bottom mb-4">Fill form</legend>
{{ form|crispy }}
</fieldset>
<div class="form-group">
<button class="btn btn-outline-info" type="submit">Submit</button>
</div>
</form>
</div>
{% endblock content %}
当我检查页面时,对象看起来像:
<input type="file" name="file_1" class="clearablefileinput form-control-file" id="id_file_1">
我希望它包含多个属性。我怎样才能做到这一点?我无法使用文档 (https://docs.djangoproject.com/en/3.2/topics/http/file-uploads/) 使其正常工作。
我试过:
widgets = {'file_1': form.ClearableFileInput(attrs={'multiple': True})}
form.instance.file_1 = form.FileField(widget=form.ClearableFileInput(attrs={'multiple':True}))
form.instance.file_1 = form.FileField(widget=form.FileInput(attrs={'multiple': True}))
我的models.py
file_1 = models.FileField(blank=True, upload_to='PN_files/%Y/%m/%d/', verbose_name="File 1", validators=[validate_file_size], help_text="Allowed size is 50MB")
我找不到可以在我的 class.
中实现的如何实现多个文件上传的示例
更新! (感谢 'amadou sow')
我已将 class 更新为:
class PostCreateView(LoginRequiredMixin, CreateView):
model = Post
fields = ['title', 'file_1']
def form_valid(self, form):
form.instance.author = self.request.user
obj = form.save(commit=False)
if self.request.FILES:
for f in self.request.FILES.getlist('file_1'):
obj = self.model.objects.create(file=f)
return super().form_valid(form)
并且我已将脚本添加到我的 HTML 页面以添加 MULTIPLE 的属性:
<script>
$(document).ready(function(){
$('#id_file_1').attr("multiple","true");
})
</script>
现在我可以选择 select 多个文件并上传它们,但是当我这样做时,只有 1 个文件存储在我的媒体文件夹中。
为了回答您的问题,我将尝试为 post 创建一个外键,并且我将使用函数 views
app/models.py:
class Post(models.Model):
#add your all other fields here execept (files)
class File(models.Model):
post = models.ForeignKey(Post,on_delete=models.CASCADE)
file = models.FileField(blank=True, upload_to='PN_files/%Y/%m/%d/', verbose_name="Files", validators=[validate_file_size], help_text="Allowed size is 50MB")
app/forms.py:
from .models import Post,File
class PostForm(forms.ModelForm):
class Meta:
model = Post
fields = [#the field that you want to rendered]
class PostFileForm(PostForm): #extending form
file = forms.FileField(widget=forms.ClearableFileInput(attrs={'multiple': True}))
class Meta(PostForm.Meta):
fields = PostForm.Meta.fields + ['file',]
app/views.py:
from .forms import PostFileForm
from .models import File
def postcreate(request):
if request.method == 'POST':
form=PostFileForm(request.POST or None,request.FILES or None)
files = request.FILES.getlist('file')
if form.is_valid():
post = form.save(commit=False)
post.author = request.user
#add everything you want to add here
post.save()
if files:#check if user has uploaded some files
for f in files:
File.objects.create(post=post,file=f)
return redirect('the-name-of-the-view')
else:
form = PostFileForm()
return render(request,'the-template-you-want-to-rendered-',{'form':form})
有了这个,你可以上传很多文件,want.and 如果你不想要求文件,你可以在 PostFileForm 中添加“required=False”。
Class用于在Django中创建表单并获取必要的信息。问题是,它只提供一个文件上传。我需要上传多个文件。我用脆皮表格。
我的简化 view.py 看起来像:
class PostCreateView(LoginRequiredMixin, CreateView):
model = Post
fields = ['title', 'file_1']
def form_valid(self, form):
form.instance.author = self.request.user
return super().form_valid(form)
HTML代码:
{% extends "blog/base.html" %}
{% load crispy_forms_tags %}
{% block content %}
<div class="content-section">
<form method="POST" enctype="multipart/form-data">
{% csrf_token %}
<fieldset class="form-group">
<legend class="border-bottom mb-4">Fill form</legend>
{{ form|crispy }}
</fieldset>
<div class="form-group">
<button class="btn btn-outline-info" type="submit">Submit</button>
</div>
</form>
</div>
{% endblock content %}
当我检查页面时,对象看起来像:
<input type="file" name="file_1" class="clearablefileinput form-control-file" id="id_file_1">
我希望它包含多个属性。我怎样才能做到这一点?我无法使用文档 (https://docs.djangoproject.com/en/3.2/topics/http/file-uploads/) 使其正常工作。
我试过:
widgets = {'file_1': form.ClearableFileInput(attrs={'multiple': True})}
form.instance.file_1 = form.FileField(widget=form.ClearableFileInput(attrs={'multiple':True}))
form.instance.file_1 = form.FileField(widget=form.FileInput(attrs={'multiple': True}))
我的models.py
file_1 = models.FileField(blank=True, upload_to='PN_files/%Y/%m/%d/', verbose_name="File 1", validators=[validate_file_size], help_text="Allowed size is 50MB")
我找不到可以在我的 class.
中实现的如何实现多个文件上传的示例更新! (感谢 'amadou sow') 我已将 class 更新为:
class PostCreateView(LoginRequiredMixin, CreateView):
model = Post
fields = ['title', 'file_1']
def form_valid(self, form):
form.instance.author = self.request.user
obj = form.save(commit=False)
if self.request.FILES:
for f in self.request.FILES.getlist('file_1'):
obj = self.model.objects.create(file=f)
return super().form_valid(form)
并且我已将脚本添加到我的 HTML 页面以添加 MULTIPLE 的属性:
<script>
$(document).ready(function(){
$('#id_file_1').attr("multiple","true");
})
</script>
现在我可以选择 select 多个文件并上传它们,但是当我这样做时,只有 1 个文件存储在我的媒体文件夹中。
为了回答您的问题,我将尝试为 post 创建一个外键,并且我将使用函数 views
app/models.py:
class Post(models.Model):
#add your all other fields here execept (files)
class File(models.Model):
post = models.ForeignKey(Post,on_delete=models.CASCADE)
file = models.FileField(blank=True, upload_to='PN_files/%Y/%m/%d/', verbose_name="Files", validators=[validate_file_size], help_text="Allowed size is 50MB")
app/forms.py:
from .models import Post,File
class PostForm(forms.ModelForm):
class Meta:
model = Post
fields = [#the field that you want to rendered]
class PostFileForm(PostForm): #extending form
file = forms.FileField(widget=forms.ClearableFileInput(attrs={'multiple': True}))
class Meta(PostForm.Meta):
fields = PostForm.Meta.fields + ['file',]
app/views.py:
from .forms import PostFileForm
from .models import File
def postcreate(request):
if request.method == 'POST':
form=PostFileForm(request.POST or None,request.FILES or None)
files = request.FILES.getlist('file')
if form.is_valid():
post = form.save(commit=False)
post.author = request.user
#add everything you want to add here
post.save()
if files:#check if user has uploaded some files
for f in files:
File.objects.create(post=post,file=f)
return redirect('the-name-of-the-view')
else:
form = PostFileForm()
return render(request,'the-template-you-want-to-rendered-',{'form':form})
有了这个,你可以上传很多文件,want.and 如果你不想要求文件,你可以在 PostFileForm 中添加“required=False”。