#18431 closed Bug (invalid)
TypedChoiceField doesn't use self.coerce in its clean() and prepare_value() methods
| Reported by: | Łukasz Langa | Owned by: | nobody | 
|---|---|---|---|
| Component: | Forms | Version: | 1.4 | 
| Severity: | Normal | Keywords: | |
| Cc: | Triage Stage: | Unreviewed | |
| Has patch: | no | Needs documentation: | no | 
| Needs tests: | no | Patch needs improvement: | no | 
| Easy pickings: | yes | UI/UX: | no | 
Description
One of the points of the clean() method is to clean the data to the correct type. When a coerce function is defined for a TypedChoiceField, it should then be used by clean() and prepare_value() as well.
Change History (3)
comment:1 by , 13 years ago
comment:2 by , 13 years ago
You're right. coerce is indeed invoked in TypedChoiceField.to_python(). The problem however is with the fact that this method first calls ChoiceField.to_python() which blatantly runs smart_unicode(value) regardless of whether that's compatible with coerce or not. Moreover, the following line in TypedChoiceField.to_python() reads:
super(TypedChoiceField, self).validate(value)
which means it skips TypedChoiceField.validate() and runs the super ChoiceField.validate() instead. Is that conscious design or is it a bug?
Also, note that prepare_value() does not use coerce at all.
comment:3 by , 13 years ago
| Resolution: | → invalid | 
|---|---|
| Status: | new → closed | 
You're describing a very high level issue with the design of Django's forms. This doesn't lead to any clear, actionnable items. As a consequence the ticket has languished here for five months without feedback.
I suggest taking this topic to the django-developers mailing list. You'll reach a wider audience and it'll be a better medium for the discussion. You should give more details; try to frame the problem and explain your proposal.
If the discussion determines that Django's behavior should be changed — taking into account backward-compatibility requirements — then you're welcome to add details to this ticket and reopen it, or to open a new one.
Clean is returning coerced value. Because clean is calling to_python method.