#28058 closed Bug (fixed)
Empty Select widget (no choices) evaluates to False
| Reported by: | László Károlyi | Owned by: | nobody | 
|---|---|---|---|
| Component: | Forms | Version: | 1.11 | 
| Severity: | Release blocker | Keywords: | select widget | 
| Cc: | Triage Stage: | Accepted | |
| Has patch: | yes | Needs documentation: | no | 
| Needs tests: | no | Patch needs improvement: | no | 
| Easy pickings: | no | UI/UX: | no | 
Description (last modified by )
Hey guys,
I'm not sure I catched a bug, but I discovered a change between Django==1.10.6 and 1.11.
When you initialize a form with a Select widget, and the select widget has no choices (basically an empty tuple), when evaluating the field with bool(), it will evaluate to False. This causes the django_widget_tweaks module not to render a widget when trying to modify it from within a template, as it uses a bool-like evaluation to check if anything is passed to the set_attr.
code to reproduce:
from django import forms
class MyForm(forms.Form):
    select = forms.ChoiceField(choices=())
x = MyForm()
for item in x:
    print(bool(item))
It will print True with Django==1.10.6, and False with Django==1.11.
The underlying problem is that len() for a Boundfield with no choices will return 0 in the newer version, whereas it returns 1 in the older version.
the template code that fails to render with Django==1.11
{{ widget|set_attr('style:width: 100%') }}
Like I said, I'm not sure if this change is intended, nevertheless I reported it. Please let me know if this is intended, so I can let the creator of django_widget_tweaks know.
Cheers
Change History (5)
comment:1 by , 9 years ago
| Description: | modified (diff) | 
|---|
comment:2 by , 9 years ago
| Severity: | Normal → Release blocker | 
|---|---|
| Triage Stage: | Unreviewed → Accepted | 
| UI/UX: | unset | 
Bisected to b52c73008a9d67e9ddbb841872dc15cdd3d6ee01 (template-based widget rendering) though I haven't identified the cause of the change.