Opened 7 years ago

Last modified 5 years ago

#28554 assigned New feature

Add support for multiple file fields

Reported by: Johannes Maron Owned by: Johannes Maron
Component: File uploads/storage Version: dev
Severity: Normal Keywords: file, storage, upload, multiple, input
Cc: info@… Triage Stage: Accepted
Has patch: yes Needs documentation: no
Needs tests: no Patch needs improvement: yes
Easy pickings: no UI/UX: no

Description

The django.db.models.FileField currently allows only to store a single file URL.
This behavior seems outdated considering that input[type=file] supports a multiple attribute, which is supported by all major Browsers.
See: https://www.w3schools.com/tags/att_input_multiple.asp

I would suggest to have a similar attribute on the database field itself, as well as on the form field and widget.

The major point for discussion would be how to store the data. The easiest would be to coma separate the paths in a single char field. The major concern here would be the lack of atomicity. For databases like Postgres I would be sensical to use the ArrayField as an underlying structure. Another way for serialisation would be the use of JSONs in a char field.

All solutions based on a text or char field have an issue related to the compatibility with the current FileField which is limited to 100 characters. The type would need to be migrated to a text type or the length would need to be increased. The latter options bares the question to which point.

Another approach would be to defer the storage issue and only provide support for multiple files on form level.
This would mean to add a multiple attribute to the form field and widget. Users would be able to create forms with multiple files in a single field and handle storage according to their preference.

Change History (12)

comment:1 by Johannes Maron, 7 years ago

Owner: changed from nobody to Johannes Maron
Status: newassigned

comment:2 by Johannes Maron, 7 years ago

I tried to exclude my personal opinion and preference from the ticket description, to have an open discussion.
So here goes my personal opinion:

It seems odd to me that the FileField is limited to 100 characters. I could not find any reference to why the field was limited in the first place. Furthermore I do not know of any file system with a 100 char limitation nor are URLs limited to only 100 chars.

Therefore I would suggest basing the FileField upon the TextField.

I would recommend splitting the issue tho. I would first add support form multiple files to form. This is a nice feature in itself and requires little work and good documentation. I would presume that such a feature would spawn a larger discussion on how to store those files. As multiple model instances? As an Array in Postgres? As CSV or JSON in a TextField? I think we can figure this out later or not at all if we don't come to a conclusion.

I would love to work on that. I do maintain [django-s3file](https://github.com/codingjoe/django-s3file/) and [django-stdimage](https://github.com/codingjoe/django-stdimage/) and have some experience with custom the FileInput and FileField. Let me know if I can be of any help.

Cheers
-joe

comment:3 by Claude Paroz, 7 years ago

Triage Stage: UnreviewedAccepted
Version: 1.11master

+1 to adding multiple at the form layer.

About storage, I'm not sure we'll find a common enough use case to implement a storage strategy in Django itself. I guess that second part warrants a discussion on django-developers.

comment:4 by Johannes Maron, 7 years ago

Has patch: set
Needs documentation: set
Needs tests: set
Patch needs improvement: set

comment:5 by Johannes Maron, 7 years ago

Needs documentation: unset
Needs tests: unset
Patch needs improvement: unset

comment:6 by Thomas Güttler, 6 years ago

Just for the records, this lib tries to solve this: https://github.com/Chive/django-multiupload

Django Multiupload

Dead simple drop-in multi file upload field for django forms using HTML5's multiple attribute.

Last edited 6 years ago by Thomas Güttler (previous) (diff)

comment:7 by Johannes Maron, 6 years ago

Thanks Thomas, I took a look at the package. It does a lot more than what I want to implement here. Still it would make sense to add basic support to Django.

comment:8 by Tim Graham, 6 years ago

Patch needs improvement: set

comment:9 by Johannes Maron, 6 years ago

Patch needs improvement: unset

comment:10 by Tim Graham, 6 years ago

Patch needs improvement: set

comment:11 by Johannes Maron, 5 years ago

Patch needs improvement: unset

comment:12 by Tim Graham, 5 years ago

Patch needs improvement: set
Note: See TracTickets for help on using tickets.
Back to Top