﻿id	summary	reporter	owner	description	type	status	component	version	severity	resolution	keywords	cc	stage	has_patch	needs_docs	needs_tests	needs_better_patch	easy	ui_ux
34651	'list' object has no attribute '_committed'	Vinícius Febasse	nobody	"I'm trying to work with multiple files without success. I'm working on the implementation in the admin, and then on to the form.

For a single file it works fine
{{{
from .models import ServiceOrder, MaintenanceService
from django.contrib import admin
from django.forms import Textarea


# Register your models here.
@admin.register(ServiceOrder)
class OrderServiceAdmin(admin.ModelAdmin):

     list_display = ('id', 'requester', 'due_date', 'service_type', 'notes', 'status', 'registration_date')
     list_display_links = ('id', 'asker',)
     list_filter = ('requester', 'due_date', 'service_type', 'status', 'registration_date')
     search_fields = ('requester', 'due_date', 'service_type', 'status', 'registration_date')
     ordering = ('-id',)
     list_per_page = 25
     formfield_overrides = {
         OrderService.request: {'widget': Textarea(attrs={'class': 'custom-textarea'})},
     }


@admin.register(MaintenanceService)
class MaintenanceService(admin.ModelAdmin):
     list_display = ('id', 'description', 'value', 'type_service', 'is_minimum_tariff', 'minimum_tariff_value', 'registration_data')
     list_display_links = ('id', 'description', 'value')
     list_filter = ('description', 'value', 'type_service', 'is_minimum_tariff', 'minimum_tariff_value', 'registration_data')
     search_fields = ('description', 'value', 'type_service', 'is_minimum_tariff', 'minimum_tariff_value', 'registration_data')
     ordering = ('description', 'value', 'type_service', 'is_minimum_rate', 'minimum_rate_value', 'registration_date')
     list_per_page = 10
}}}
But when I try to do it for multiples I get this error: 'list' object has no attribute '_committed'
{{{
from .models import ServiceOrder, MaintenanceService
from django.contrib import admin
from django.forms import Textarea
from django import forms
from django.core.files import File
from django.core.files import File as DjangoFile


class MultipleFileInput(forms.ClearableFileInput):
     allow_multiple_selected = True


class MultipleFileField(forms.FileField):
     def __init__(self, *args, **kwargs):
         kwargs.setdefault(""widget"", MultipleFileInput())
         super().__init__(*args, **kwargs)

     def clean(self, data, initial=None):
         single_file_clean = super().clean
         if isinstance(data, (list, tuple)):
             result = [single_file_clean(d, initial) for d in data]
         else:
             result = single_file_clean(data, initial)
         return result


class OrderServiceAdminForm(forms.ModelForm):
     attachment = MultipleFileField(required=False)

     class Meta:
         model = ServiceOrder
         fields=""__all__""


# Register your models here.
@admin.register(ServiceOrder)
class OrderServiceAdmin(admin.ModelAdmin):
     form = OrderServiceAdminForm

     list_display = ('id', 'requester', 'due_date', 'service_type', 'notes', 'status', 'registration_date')
     list_display_links = ('id', 'asker',)
     list_filter = ('requester', 'due_date', 'service_type', 'status', 'registration_date')
     search_fields = ('requester', 'due_date', 'service_type', 'status', 'registration_date')
     ordering = ('-id',)
     list_per_page = 25
     formfield_overrides = {
         OrderService.request: {'widget': Textarea(attrs={'class': 'custom-textarea'})},
     }

     def save_model(self, request, obj, form, change):
         super().save_model(request, obj, form, change)

         if form.cleaned_data.get('attachment'):
             for file in form.cleaned_data['attached']:
                 file_obj = DjangoFile(file, name=file.name)
                 obj.attachment.create(file=file_obj)


@admin.register(MaintenanceService)
class MaintenanceService(admin.ModelAdmin):
     list_display = ('id', 'description', 'value', 'type_service', 'is_minimum_tariff', 'minimum_tariff_value', 'registration_data')
     list_display_links = ('id', 'description', 'value')
     list_filter = ('description', 'value', 'type_service', 'is_minimum_tariff', 'minimum_tariff_value', 'registration_data')
     search_fields = ('description', 'value', 'type_service', 'is_minimum_tariff', 'minimum_tariff_value', 'registration_data')
     ordering = ('description', 'value', 'type_service', 'is_minimum_rate', 'minimum_rate_value', 'registration_date')
     list_per_page = 10
}}}"	Cleanup/optimization	closed	Uncategorized	4.2	Normal	invalid			Unreviewed	0	0	0	0	0	0
