首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何在Django Admin中上传多个文件?

在Django Admin中上传多个文件可以通过以下步骤实现:

  1. 首先,需要在Django项目中创建一个模型(Model),用于存储上传的文件。可以使用FileField或者ImageField字段来表示文件类型。
代码语言:txt
复制
from django.db import models

class MyModel(models.Model):
    files = models.FileField(upload_to='uploads/')
  1. 接下来,在Django的Admin中注册这个模型,以便在后台管理界面进行文件上传操作。
代码语言:txt
复制
from django.contrib import admin
from .models import MyModel

@admin.register(MyModel)
class MyModelAdmin(admin.ModelAdmin):
    pass
  1. 为了在Admin中支持多文件上传,需要在前端界面中添加相应的HTML和JavaScript代码。可以使用第三方库,如Dropzone.js,以提供更好的用户体验和功能。
代码语言:txt
复制
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")),
]
  1. 创建一个定制的Admin视图,以覆盖默认的上传行为。可以通过重写change_form.html模板和change_form.html视图来实现。
代码语言:txt
复制
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)
  1. 最后,在change_form.html模板中添加文件上传的相关HTML代码,以及Dropzone.js的初始化脚本。
代码语言:txt
复制
{% 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等云计算品牌商。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • Django中FilePathField字段的使用

    class FilePathField(path=None[, match=None, recursive=False, max_length=100, **options]) 一个 CharField ,内容只限于文件系统内特定目录下的文件名。有三个参数, 其中第一个是 必需的: FilePathField.path 必填。这个FilePathField 应该得到其选择的目录的绝对文件系统路径。例如: "/home/images". FilePathField.match 可选的.FilePathField 将会作为一个正则表达式来匹配文件名。但请注意正则表达式将将被作用于基本文件名,而不是完整路径。例如: "foo.*.txt$", 将会匹配到一个名叫 foo23.txt 的文件,但不匹配到 bar.txt 或者 foo23.png. FilePathField.recursive 可选的.True 或 False.默认是False.声明是否包含所有子目录的路径 FilePathField.allow_files 可选的.True 或 False.默认是True.声明是否包含指定位置的文件。该参数或allow_folders 中必须有一个为 True. FilePathField.allow_folders 是可选的.输入 True 或者 False.默认值为 False.声明是否包含指定位置的文件夹。该参数或 allow_files 中必须有一个为 True. 当然,这些参数可以同时使用。 有一点需要提醒的是 match只匹配基本文件名(base filename), 而不是整个文件路径(full path). 例如: FilePathField(path="/home/images", match="foo.*", recursive=True) ...将匹配/home/images/foo.png而不是/home/images/foo/bar.png 因为只允许匹配 基本文件名(foo.png 和 bar.png). FilePathField实例被创建在您的数据库为varchar列默认最大长度为 100 个字符。作为与其他字段,您可以更改使用的max_length最大长度。 大多数网站在插入图片时一般都是这样处理的: 上传大尺寸图时,自动生成一张缩略图;网页中插入缩略图,并把地址指向大尺寸的图。 所以在Django中,我这样定义主要字段: title = models.CharField(max_length = 120) img = models.ImageField(upload_to = 'screenshots') thumb = models.FilePathField(path = 'screenshots/thumb') 为什么thumb不是ImageFiled呢?因为考虑到Admin中上传的是大图,而缩略图不是上传,而是自动生成的。所以在这样写。具体的处理是(假设MEDIA_ROOT为/tmp,MEDIA_URL为http://localhost/media/: 上传图片(test.jpg)至MEDIA_ROOT/screenshots,此时img的属性是:img.name = screenshots/test.jpg, img.path = /tmp/screenshots/test.jpg, img.url = http://localhost/media/screenshots/test.jpg 判断图片大小是否需要做缩略图,如果不需要,直接复制img.path到thumb,否则,生成一张缩略图(以test-thumb.jpg命名)保存在screenshots/thumb下。 在网页中插入图片时,就可以简单地用{% object.title %}来表示了。object表示一个ScreenShot。

    05
    领券