You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在Django Admin中通过单个「选择文件」选择器上传多张图片

嘿,这个需求我太熟了!之前做电商类Django项目时也碰到过同样的问题——默认的admin inline逐个添加图片实在太繁琐,单个选择器批量上传才是高效的解决方案。我给你整理了两种靠谱的实现方式,看你偏好哪种:

第一步:先确认你的模型结构(这部分你已经想对了,先巩固下)

首先咱们的模型分层是对的,用单独的ItemImage模型关联Item,避免固定字段的局限性:

from django.db import models

class Item(models.Model):
    name = models.CharField(max_length=100)
    # 这里加你的其他商品字段,比如价格、分类等等

class ItemImage(models.Model):
    item = models.ForeignKey(Item, on_delete=models.CASCADE, related_name='images')
    image = models.ImageField(upload_to='item_images/')

方案一:用第三方库快速实现Admin批量上传(最省心)

推荐用django-admin-multiupload这个库,它能直接在Admin页面给你的Item添加一个批量上传按钮,不用再逐个点inline的添加按钮。

  1. 先安装库:
pip install django-admin-multiupload
  1. settings.pyINSTALLED_APPS里加一行:
INSTALLED_APPS = [
    # 其他已有的app...
    'multiupload',
]
  1. 自定义Admin类:
from django.contrib import admin
from multiupload.admin import MultiUploadAdmin
from .models import Item, ItemImage

# 保持原来的inline不变(用来显示已上传的图片)
class ItemImageInline(admin.TabularInline):
    model = ItemImage
    extra = 0

class ItemAdmin(MultiUploadAdmin):
    inlines = [ItemImageInline]
    # 配置批量上传的处理逻辑,把上传的图片关联到当前Item
    def process_uploaded_file(self, uploaded_file, object, request):
        return ItemImage.objects.create(item=object, image=uploaded_file)

admin.site.register(Item, ItemAdmin)

这样配置完后,你在Admin的Item编辑页面,会看到一个「Upload multiple files」的按钮,点击就能一次性选多张图片上传,自动关联到当前商品,完美替代繁琐的inline逐个添加!

方案二:自定义Admin表单实现批量上传(不用依赖第三方)

如果你不想加第三方依赖,也可以自己写Admin表单来实现多文件选择:

  1. 自定义Admin表单:
from django import forms
from .models import Item, ItemImage

class ItemAdminForm(forms.ModelForm):
    # 添加一个多文件选择字段
    images = forms.FileField(
        widget=forms.ClearableFileInput(attrs={'multiple': True}),
        required=False,
        label="批量上传商品图片"
    )

    class Meta:
        model = Item
        fields = '__all__'

    def save(self, commit=True):
        # 先保存Item本身
        instance = super().save(commit=commit)
        # 如果有上传的图片,逐个创建ItemImage对象
        if commit and 'images' in self.files:
            for image_file in self.files.getlist('images'):
                ItemImage.objects.create(item=instance, image=image_file)
        return instance
  1. 把这个表单用到ItemAdmin里:
from django.contrib import admin
from .models import Item
from .forms import ItemAdminForm

class ItemAdmin(admin.ModelAdmin):
    form = ItemAdminForm

admin.site.register(Item, ItemAdmin)

这样在Admin的Item编辑页面,会出现一个支持多选的文件选择框,选完多张图片后点保存,系统会自动把所有图片关联到当前Item上。

额外:如果需要前端用户上传多图的思路

要是你的项目需要普通用户在前端页面批量上传商品图片,逻辑也类似:

  • 前端用<input type="file" name="images" multiple>
  • 后端视图里获取request.FILES.getlist('images'),然后逐个创建ItemImage关联到对应的Item对象就行。

内容的提问来源于stack exchange,提问作者user9229406

火山引擎 最新活动