Opened 4 years ago

Last modified 4 years ago

#16328 new Bug

FilePathField should include blank option even when required=True

Reported by: ringemup@… Owned by: nobody
Component: Forms Version: 1.3
Severity: Normal Keywords:
Cc: Triage Stage: Accepted
Has patch: no Needs documentation: no
Needs tests: no Patch needs improvement: no
Easy pickings: no UI/UX: yes

Description

Because there is no blank option in FilePathField form fields when required=True, it is not possible to save an admin form with blank inlines that contain FilePathFields. Since an empty-string option does not pass the required=True validator, the simplest fix is simply to include a (,'----------') option as the first choice for the field, just as with other ChoiceFields.

Change History (2)

comment:1 Changed 4 years ago by anonymous

  • Needs documentation unset
  • Needs tests unset
  • Patch needs improvement unset
  • Summary changed from FilePathField should include blank option even when required=False to FilePathField should include blank option even when required=True

comment:2 Changed 4 years ago by aaugustin

  • Easy pickings unset
  • Triage Stage changed from Unreviewed to Accepted

It took me a bit of time to figure out the problem; here's my analysis.

Django's forms have an (undocumented) empty_permitted attribute. When this attribute is set to True, validation is short-circuited (see lines 263-266 in django/forms/forms.py). Formsets need this internal API to display extra forms to add objects, but ignore them if they are submitted unchanged (empty). Specifically, the inlines feature of the admin uses this.

However, it isn't possible to submit a formset unchanged when it contains a FilePathField. This problem may affect other fields that can't be submitted with an empty value, given the UI (radio buttons, drop-down selects), when blank=False. The common point of these fields is that their value must be chosen from a finite set defined by their choices attribute.

In my opinion, the proper fix is to render fields as if blank was True when empty_permitted is True, probably by setting their include_blank attribute to True. Thus, the select widget for FilePathField will contain the blank choice, BLANK_CHOICE_DASH, as the first item, resolving the problem described originally.

Unfortunately, I failed to write a patch for this because I'm not sufficiently familiar with the forms implementation. After searching for all instances of include_blank and empty_permitted, I couldn't bridge the gap between them. This isn't an easy picking after all :)

Note: See TracTickets for help on using tickets.
Back to Top