在Django Admin中上传多个文件可以通过以下步骤实现:
from django.db import models
class MyModel(models.Model):
files = models.FileField(upload_to='uploads/')
from django.contrib import admin
from .models import MyModel
@admin.register(MyModel)
class MyModelAdmin(admin.ModelAdmin):
pass
from django.contrib import admin
from django.urls import path
from django.conf.urls import url
from django.views.generic import TemplateView
from .views import MyModelAdmin
urlpatterns = [
path('admin/', admin.site.urls),
url(r'^admin/', TemplateView.as_view(template_name="admin/my_model/change_form.html")),
]
change_form.html
模板和change_form.html
视图来实现。from django.contrib import admin
from django.core.files.base import ContentFile
from django.shortcuts import render
from django.views.decorators.csrf import csrf_exempt
from .models import MyModel
@admin.register(MyModel)
class MyModelAdmin(admin.ModelAdmin):
change_form_template = 'admin/my_model/change_form.html'
def changeform_view(self, request, object_id=None, form_url='', extra_context=None):
# 处理文件上传请求
if request.method == 'POST':
files = request.FILES.getlist('files')
mymodel = MyModel.objects.get(pk=object_id)
for file in files:
# 保存文件到模型实例
mymodel.files.save(file.name, file)
return render(request, self.change_form_template, {'object': mymodel})
return super().changeform_view(request, object_id, form_url, extra_context)
change_form.html
模板中添加文件上传的相关HTML代码,以及Dropzone.js的初始化脚本。{% extends "admin/change_form.html" %}
{% block extrahead %}
{{ block.super }}
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/dropzone@5.9.2/dist/dropzone.css">
{% endblock %}
{% block object-tools-items %}
{{ block.super }}
<form action="" method="post" enctype="multipart/form-data" class="dropzone" id="myDropzone">
{% csrf_token %}
</form>
{% endblock %}
{% block javascript %}
{{ block.super }}
<script src="https://cdn.jsdelivr.net/npm/dropzone@5.9.2/dist/dropzone.js"></script>
<script>
// 初始化Dropzone.js
Dropzone.autoDiscover = false;
var myDropzone = new Dropzone("#myDropzone", {
paramName: "files", // 与视图中的文件名对应
maxFilesize: 5, // 最大文件大小(单位:MB)
dictDefaultMessage: "将文件拖拽到此处或点击上传",
acceptedFiles: ".jpg,.jpeg,.png,.gif,.txt,.pdf", // 允许上传的文件类型
init: function () {
var self = this;
// 上传成功后刷新页面
self.on("complete", function (file) {
if (file.status === "success") {
location.reload();
}
});
}
});
</script>
{% endblock %}
这样,在Django Admin中就可以实现多文件上传的功能了。用户可以拖拽文件到指定区域或者点击上传按钮选择多个文件进行上传。上传的文件将保存在指定目录下,并与对应的模型关联起来。
这里推荐腾讯云的对象存储服务 COS(云对象存储),用于存储上传的文件。COS 提供安全可靠、高扩展、低成本的云端存储服务,适用于各种数据存储、备份和分享场景。您可以通过以下链接了解更多关于腾讯云 COS 的信息:
请注意,本答案中不涉及亚马逊AWS、Azure、阿里云、华为云、天翼云、GoDaddy、Namecheap、Google等云计算品牌商。
领取专属 10元无门槛券
手把手带您无忧上云