Skip to content

Changelog

Changelog

5.2.0 (November 8 2026)

  • Apply FILE_FORM_MUST_LOGIN option to S3 views.
  • S3 uploads: create the S3 client with django-storages' S3Boto3Storage, so the upload views also use settings such as AWS_S3_ADDRESSING_STYLE, AWS_S3_PROXIES, AWS_S3_CLIENT_CONFIG, AWS_SESSION_TOKEN and AWS_S3_SESSION_PROFILE. Reading an uploaded S3 file now uses the same configuration as the upload views, including the DJANGO_AWS_STORAGE_BUCKET_NAME and AWS_S3_ENDPOINT_URL environment variables.
  • S3 uploads: an error status from the S3 views now fails the upload. Before, an error with a JSON body was read as a normal response; for example, a failed request to complete the upload was reported as a successful upload.
  • S3 uploads: retry a request after a network error or a 408, 429 or 5xx response, using the retryDelays JavaScript option. This applies to creating the upload, uploading a part and completing the upload. Only the failed part is uploaded again.
  • S3 uploads: abort the multipart upload when an upload fails, so the uploaded parts are removed from S3.
  • S3 uploads: call the onError JavaScript callback when an upload fails.
  • S3 uploads: call the onSuccess JavaScript callback when an upload is done, and the onProgress callback when progress information is available.
  • Don't upload a file that is dropped on a disabled file input.
  • When a file input without multiple gets a new file, remove the current file like the delete button does: abort it while it's uploading, and delete it from the server when it's uploaded. Before, an upload that was still running continued in the background. The removeUpload event and the onDelete callback are now also called for the replaced file.
  • Add --dry-run option to the delete_unused_files management command.
  • Tus uploads: lock concurrent PATCH and DELETE requests for the same upload.
  • Tus uploads: support the expiration extension; responses include an Upload-Expires header.
  • Tus uploads: remove the Access-Control-* headers that allowed any origin. Cross-origin uploads didn't work, because preflight requests were rejected and a CSRF token is required. Use django-cors-headers if you need CORS.
  • delete_unused_files no longer deletes files of tus uploads that are still in progress; unfinished uploads are deleted once they expire.
  • Tus uploads: use the size of the received data instead of the Content-Length header for the upload offset.
  • Tus uploads: reject a POST without a valid Upload-Length header or without a formId in the Upload-Metadata header (400), and a chunk that exceeds the upload length (413).
  • Tus uploads: respond with 412 to a request without a supported Tus-Resumable header (was 400 for a POST and not checked for other requests), and with 415 to a PATCH request without Content-Type: application/offset+octet-stream.
  • Tus uploads: respond to OPTIONS requests with the configuration of the tus server.
  • Add the FILE_FORM_MAX_UPLOAD_SIZE setting for the maximum size of a tus upload.
  • Tus uploads: fix uploading an empty file. The tus client doesn't send a PATCH request for an empty file, so the uploaded file wasn't saved.

5.1.0 (October 13 2026)

  • Issue #1389 Improve accessibility.
  • Use buttons for cancel and delete
  • Add aria role and aria label to progress bar
  • Announce status changes to screen readers
  • Use 'list' aria role
  • Make filename accessible by keyboard
  • Use aria-describedby for error messages

5.0.1 (September 6 2026)

  • Issue #1341 Include locale files in the package.

5.0.0 (September 6 2026)

  • Issue #1336: make the JavaScript bundle smaller.
  • It's now 46k (minified, not gzipped), which is 50% smaller.
  • Drop support for very old browsers.
  • Rely on mime type support from the browser instead of using a library.
  • Replace glob library with custom code.
  • Replace eventemitter3 with custom events.
  • The addUpload, removeUpload and uploadComplete events are dispatched on the form element.
  • The eventEmitter option of initUploadFields is removed. See 'JavaScript events'.

4.1.0 (August 6 2026)

  • Issue #1300: support Django 6.1; drop support for Django 4.2

4.0.0 (December 5 2025)

  • Support Django 6.0; drop support for Django 5.1

3.9.1 (November 11 2025)

  • Issue #1158: return bad request status for missing meta data (thanks to Ivan Cvetkovic)

3.9.0 (April 8 2025)

  • Support Django 5.2; drop support for Django 5.0

3.8.2 (March 9 2025)

  • Issue #1018: correctly compile JavaScript bundle

3.8.1 (March 8 2025)

  • Issue #1011: handle a model form with an empty value (thanks to Darien Reese)
  • Issue #1018: make the extension match case insensitive

3.8.0 (August 14 2024)

  • Issue #880. Support Django 5.1

3.7.0 (June 27 2024)

  • Issue #784: compile to ES6. This reduces the size of the minified JavaScript file to 80k (from 119k)
  • Issue #841: drop support for Django 3.2
  • Issue #891: handle error with empty initial file in model form (thanks to Yanhui Xie)

3.6.0 (December 8 2023)

  • Issue #748: support Django 5.0

3.5.4 (28 October 2023)

  • Issue #760: support django-storages 1.14

3.5.3 (3 September 2023)

  • Issue #680: support the disabled property
  • Issue #685: use a path for the location header to prevent mixed content issues (thanks to Walter Lorenzetti)

3.5.2 (31 May 2023)

  • Issue #667: uploadComplete sends wrong element with multiple file forms on a page
  • Issue #669: rename the minified version to file_form.min.js

3.5.1 (4 May 2023)

  • Issue #638: handle modelform field without associated file (thanks to Walter Lorenzetti)

3.5.0 (4 April 2023)

  • Issue #614: prevent uploading multiple files for a single file upload (thanks to Krzysztof Kosiorek)
  • Support Django 4.2

3.4.4 (30 January 2023)

  • Issue #588: remove temporary uploaded file when deleting a submitted upload
  • Issue #590: add the file id to the onClick handler

3.4.3 (14 January 2023)

  • Issue #579: onClick handler (thanks to mi01)

3.4.2 (7 December 2022)

  • Issue #531: add Finnish translations (thanks to Tuomas Vihinen)
  • Issue #555: code scanning alert

3.4.1 (31 August 2022)

  • Issue #523: add package lock file (thanks to Saurabh Kumar)
  • Issue #524: add JavaScript validation for acceptable file types (thanks to Saurabh Kumar)
  • Issue #528: fix single upload input

3.4.0 (5 August 2022)

  • Issue #521: support Django 4.1

3.3.2 (1 June 2022)

  • Issue #514: prevent migrations when the DEFAULT_AUTO_FIELD is set.
  • The TemporaryUploadedFile model now uses AutoField.

3.3.1 (2 April 2022)

  • Issue #498: added Spanish translations (thanks to Juan Helios García Guzmán)
  • Issue #504: handle multiple 'upload failed' error messages (thanks to Krzysztof Kosiorek)

3.3.0 (8 December 2021)

  • Support Django 4.0

3.2.3 (3 October 2021)

  • Issue #471: fix security advice: uncontrolled data used in path expression
  • Issue #481: make cache timeout configurable (thanks to Seb Haase)

3.2.2 (17 June 2021)

  • Issue #456: handle data parameter with the None value
  • Issue #465: remove unused FILE_FORM_MAX_FILE_SIZE setting
  • Issue #468: fix modelformset with S3 upload

3.2.1 (20 April 2021)

  • Issue #445: fix ModelForm update with multiple files (thanks to Arcuri Davide)

3.2.0 (6 April 2021)

  • Issue #443: support Django 3.2
  • Issue #446: add AWS_S3_REGION_NAME and AWS_S3_SIGNATURE_VERSION settings (thanks to Niklas Wahl)
  • Issue #449: add German translations (thanks to Niklas Wahl)

3.1.5 (29 March 2021)

  • Issue #211: auto initialize JavaScript
  • Issue #339: Django admin support

3.1.4 (8 March 2021)

  • Issue #436: allow customization of the widget (thanks to Bo Peng)
  • Issue #439: support ModelForm

3.1.3 (19 January 2021)

  • Issue #422: add model rename to migrations (thanks to Shrikrishna Singh)

3.1.2 (27 December 2020)

  • Issue #418: correctly remove upload

3.1.1 (26 November 2020)

  • Issue #388: add cross-site request forgery protection to tus uploads using the standard Django CSRF token
  • Issue #393: fix delete-unused-files command (thanks to Seb Haase)
  • issue #401: optimization: use move instead of copy when possible

3.1.0 (15 September 2020)

  • Issue #324: get placeholder file for UploadWidget (thanks to Shrikrishna Singh)
  • Issue #330: allow upload directly to S3 compatible storages (thanks to Bo Peng)
  • Issue #331: fix error in deleting files (thanks to Bo Peng)
  • Issue #333: replace existing uploaded file with the same name (thanks to Bo Peng)
  • Issue #341: add JavaScript events (experimental)
  • Issue #346: allow definition of s3_upload_dir in form class (thanks to Bo Peng)

3.0.1 (4 September 2020)

  • Issue #347: add chunkSize parameter to avoid request error in Django

3.0.0 (6 August 2020)

  • Issue #320: fix UploadMultipleWidget to return correct placeholder files (thanks to Shrikrishna Singh)
  • Issue #325: support Django 3.1

2.2.0 (22 July 2020)

  • Issue #315: file is not removed after form error
  • Issue #313: allow using custom storage and custom cache (thanks to Balazs Endresz)

2.1.3 (20 June 2020)

  • Issue #304: rewrite frontend in typescript
  • Issue #305: don't change migration when setting changes (thanks to Lionqueen94)
  • Issue #307: add French translations; also make translations discoverable by makemessages (thanks to Simon Maillard)

2.1.2 (20 April 2020)

  • Issue #298: directory support for drop area
  • Issue #300: add migration so makemigrations will not create one (thanks to Lionqueen94)

2.1.1 (7 April 2020)

  • Issue #290: add JavaScript callbacks (thanks to Peter Dekkers)
  • Issue #296: fix progress bar
  • Issue #297: add retry delays

2.1.0 (28 March 2020)

  • Issue #266: allow relative FILE_FORM_UPLOAD_DIR setting (thanks to Bo Peng)
  • Issue #267: add drop area (thanks to Bo Peng)
  • Issue #275: show size of uploaded files (thanks to Bo Peng)
  • Issue #278: allow the addition of placeholder files (thanks to Bo Peng)
  • Issue #280: remove option FILE_FORM_FILE_STORAGE

2.0.3 (15 February 2020)

  • Issue #237: using with form set (thanks to Juan Carlos Carvajal)
  • Issue #259: include uncompressed JavaScript
  • Issue #260: correctly use formset prefix (thanks to Gzuba)
  • Issue #261: fix default for FILE_FORM_UPLOAD_DIR (thanks to Gzuba)

2.0.2 (14 January 2020)

  • Issue #247: support form wizard (thanks to Lionqueen94)
  • Issue #251: delete after submit

2.0.1 (6 January 2020)

  • Issue #240: add empty dff-files div (thanks to Lionqueen94)
  • Issue #241: CSP compliance (thanks to Lionqueen94)

2.0 (30 December 2019)

  • Use tus instead of fine uploader

1.0 (5 December 2019)

  • Drop support for Python 2 and Django < 2
  • Issue #217: update fine uploader
  • Issue #219: use Selenium for all tests
  • Issue #222: use pathlib2 (instead of pathlib)
  • Issue #235: support Django 3.0

0.4.2 (3 March 2019)

  • Issue #207: support form prefixes (thanks to Iw108)
  • Issue #201: fix multiple file upload without AJAX (thanks to Lionqueen94)

0.4.1 (5 January 2019)

  • Issue #194: correctly call is_authenticated (thanks to Dureba)

0.4.0 (3 August 2018)

  • Support Django 2.1 and Python 3.7
  • Issue #173: add i18n to upload widget (thanks to Arman Roomana)

0.3.0 (6 December 2017)

  • Support Django 2.0