如何在Django Admin后台实现多图片批量上传功能
解决方案
方案1:在Event编辑页内嵌多图上传(推荐)
无需单独跳转EventPhotos管理页,创建/编辑活动时可直接上传多张图片,操作更顺畅。
修改应用下的admin.py文件,代码如下:
from django.contrib import admin from django import forms from .models import Event, EventPhotos # 自定义Event表单,新增多图上传字段 class EventAdminForm(forms.ModelForm): photos = forms.ImageField( label="上传活动图片", widget=forms.ClearableFileInput(attrs={"multiple": True}), required=False ) class Meta: model = Event fields = "__all__" # 内联展示已上传的活动图片 class EventPhotosInline(admin.TabularInline): model = EventPhotos extra = 0 readonly_fields = ("photo",) class EventAdmin(admin.ModelAdmin): form = EventAdminForm inlines = [EventPhotosInline] # 重写保存逻辑,批量创建图片关联记录 def save_model(self, request, obj, form, change): super().save_model(request, obj, form, change) photos = request.FILES.getlist("photos") for photo in photos: EventPhotos.objects.create(event=obj, photo=photo) # 注册模型 admin.site.register(Event, EventAdmin) # 若不需要单独管理EventPhotos可注释下面的注册代码 # admin.site.register(EventPhotos)
方案2:保留原操作流程,给EventPhotos管理页加批量上传
如果你还是希望沿用「先创建Event、再进入EventPhotos管理页上传」的原有流程,使用以下admin.py配置:
from django.contrib import admin from django import forms from .models import Event, EventPhotos class EventPhotosAdminForm(forms.ModelForm): photos = forms.ImageField( label="上传多张图片", widget=forms.ClearableFileInput(attrs={"multiple": True}), required=True ) class Meta: model = EventPhotos fields = ["event"] class EventPhotosAdmin(admin.ModelAdmin): form = EventPhotosAdminForm def save_model(self, request, obj, form, change): event = form.cleaned_data["event"] photos = request.FILES.getlist("photos") for photo in photos: EventPhotos.objects.create(event=event, photo=photo) admin.site.register(Event, admin.ModelAdmin) admin.site.register(EventPhotos, EventPhotosAdmin)
必要配置检查
确保你的项目已经配置了媒体文件存储规则,否则图片无法正常存储和访问:
settings.py中添加配置:
MEDIA_URL = '/media/' MEDIA_ROOT = BASE_DIR / 'media'
- 项目根
urls.py中添加开发环境访问路由:
from django.conf import settings from django.conf.urls.static import static urlpatterns = [ # 你的原有路由配置 ] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
内容的提问来源于stack exchange,提问作者Henry Davidson
相关产品推荐
相关产品推荐

