Opened 8 years ago
Closed 8 years ago
#27495 closed Bug (needsinfo)
MultipleChoiceField isn't working with options longer than 1 character
Reported by: | Mario Härtwig | Owned by: | nobody |
---|---|---|---|
Component: | Forms | Version: | 1.10 |
Severity: | Normal | Keywords: | MultipleChoiceField |
Cc: | Triage Stage: | Unreviewed | |
Has patch: | no | Needs documentation: | no |
Needs tests: | no | Patch needs improvement: | no |
Easy pickings: | no | UI/UX: | no |
Description
The MultipleChoiceField doesn't seem to work it the name of the option in the choices list is longer than one character. If the options specified in the choices list are longer, the selected values cannot be restored after the form has been saved.
(('1', 'foo'), ('b', 'bar'),)
works whereas
(('foo', 'foo'), ('bar, 'bar'),)
The values are saved as a string inside the database (e.g. "['foo', 'bar']"). The problem seems to be line Line 564 in forms/widgets.py. This line tries to convert the array-like string from the database to an array without deserializing it before.
The string "['foo', 'bar']", for instance, is converted to {'o', ' ', 'a', "'", 'b', 'r', ']', ',', 'f', '['}.
I've created a fix that solves the issue and I could create a pull request. However, I'm wondering if there shouldn't be some kind of deserialization of the array-like string before. And why isn't the array stored in a JSON strucure within the database (with double quotes). Am I missing something?
Attachments (1)
Change History (4)
comment:1 by , 8 years ago
by , 8 years ago
Attachment: | 27495-test.diff added |
---|
comment:2 by , 8 years ago
Thanks for your reply. Your test works for me as well. However, when using a widget with your choices-list for a model field, saving the model and re-opening the form, no option is selected. The line mentioned above turns
['1A', '2B']
into
{' ', 'A', ']', ',', '[', "'", '1', '2', 'B'}
Your test doesn't save anything to the database which is why everything seem to work. You should be able to reproduce it when using your choices-list in an app. If not, I have to dive deeper into the Django test suite for being able to write a test demonstrating the issue.
comment:3 by , 8 years ago
Component: | Uncategorized → Forms |
---|---|
Resolution: | → needsinfo |
Status: | new → closed |
Type: | Uncategorized → Bug |
I guess maybe you're using MultipleChoiceField
with CharField
? If so, then no, I wouldn't expect MultipleChoiceField
to be an appropriate form field. If you want to provide more details and/or a patch that doesn't break things, feel free to reopen. Thanks.
Could you please include a more complete example to reproduce the issue? I wrote the attached and everything seems to be working as expected but I guess it doesn't demonstrate what you're doing.