import os import shutil from django import forms from django.db import models from django.db.models import FileField from django.contrib import admin from django.core.cache import cache from django.core.files.uploadedfile import SimpleUploadedFile # Class only used for denotation. from django.http.request import HttpRequest from .models import FineFile from django_fine_uploader import widgets @admin.register(FineFile) class FineFileAdmin(admin.ModelAdmin): formfield_overrides = { models.FileField: { 'widget': widgets.FineUploaderWidget(attrs={'admin': True, 'itemLimit': 1}) }, } class Media: js = ( '//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js', ) def fineuploader_setting(self, request: HttpRequest): post_info = request.POST.dict() if type(self.formfield_overrides.get(FileField).get('widget')) is widgets.FineUploaderWidget: model_fields = self.model._meta.fields file_fields = {} file_fields_name = [] for field in model_fields: if field.get_internal_type() is 'FileField': file_fields_name.append(field.name) if request.method == 'POST': print(file_fields_name) for name in file_fields_name: file_uploader = cache.get(request.POST.get(name)) if file_uploader is None: return # raise forms.ValidationError("There is no file in the field.") file_path = file_uploader.storage.path(file_uploader.real_path) post_info[name] = SimpleUploadedFile( file_uploader.filename, open(file_path, 'rb').read() ) request.POST = post_info folder_path = file_uploader.storage.path(file_uploader.file_path) try: shutil.rmtree(folder_path) except (OSError, PermissionError): pass # return post_info def add_view(self, request, form_url='', extra_context=None): self.fineuploader_setting(request) return super(type(self), self).add_view(request, form_url, extra_context) def change_view(self, request, object_id, form_url='', extra_context=None): self.fineuploader_setting(request) return super(type(self), self).change_view(request, object_id, form_url, extra_context)