Opened 17 years ago
Closed 17 years ago
#6146 closed (invalid)
newsforms.widget.Select does not accept long int as choices
Reported by: | Owned by: | nobody | |
---|---|---|---|
Component: | Forms | Version: | dev |
Severity: | Keywords: | choices mysql | |
Cc: | Triage Stage: | Unreviewed | |
Has patch: | no | Needs documentation: | no |
Needs tests: | no | Patch needs improvement: | no |
Easy pickings: | no | UI/UX: | no |
Description
While using newforms form_for_instance or form_for_model, I was trying to override the form:
MyModelAddForm = form_for_model(MyModel) MyModelAddForm.base_fields['field_one'].widget = forms.Select(choices=[(testa.id, testa.name) for testa in Test.objects.all()]) MyModelAddForm.base_fields['field_two'].widget = forms.CheckboxSelectMultiple(choices=[(testb.id, testb.name) for testb in Test.objects.all()])
However, I was getting the error that there are "too many values to unpack". After a little debugging I found that MySQL is returning "1L", "2L", etc. as the id/pk. This is recognized in the tests http://code.djangoproject.com/browser/django/trunk/tests/modeltests/field_defaults/models.py as MySQL behavior. However, for new forms the Select field seems to be looking for an Integer only.
By adding int() around the returning id/pk field, the problem was fixed.
MyModelAddForm = form_for_model(MyModel) MyModelAddForm.base_fields['field_one'].widget = forms.Select(choices=[(int(testa.id), testa.name) for testa in Test.objects.all()]) MyModelAddForm.base_fields['field_two'].widget = forms.CheckboxSelectMultiple(choices=[(int(testb.id), testb.name) for testb in Test.objects.all()])
I believe that Long Integers from MySQL shouldn't have the trailing L.
Change History (1)
comment:1 by , 17 years ago
Resolution: | → invalid |
---|---|
Status: | new → closed |
Summary: | Integers (PK fields) on MySQL break newforms Choices → newsforms.widget.Select does not accept long int as choices |
Those are HTML widgets and as such only deal with strings. You really should be adding str() around testa/testb.id.