Opened 4 years ago

Closed 4 years ago

#19643 closed Bug (fixed)

TypedChoiceField and TypedMultipleChoiceField call the super validate() method instead of their own

Reported by: Berislav Lopac Owned by: Berislav Lopac
Component: Forms Version: master
Severity: Normal Keywords: MultipleChoiceField TypedMultipleChoiceField
Cc: frnhr Triage Stage: Accepted
Has patch: yes Needs documentation: no
Needs tests: yes Patch needs improvement: no
Easy pickings: yes UI/UX: no


As it can be seen on, instead of calling self.validate() the code is actually super(TypedChoiceField, self).validate(value); it's the same on

On the other hand, the definition of the validate() methods in both classes is a simple "pass".

I believe this is a bug because it makes it impossible to extend those classes and customize the validate() method. Specifically, in this example the validate() is never called:

class CustomTypedMultipleChoiceField(forms.TypedMultipleChoiceField):
    def validate(self, value):

I propose that, instead of the current situation, lines 730 and 780 are replaced with self.validate(), and the validate() method definitions are either removed or changed to call the super.

Change History (10)

comment:1 Changed 4 years ago by Claude Paroz

Needs documentation: unset
Needs tests: unset
Patch needs improvement: unset
Triage Stage: UnreviewedAccepted

comment:2 Changed 4 years ago by Berislav Lopac

Owner: changed from nobody to Berislav Lopac
Status: newassigned

comment:3 Changed 4 years ago by frnhr

Cc: frnhr added

comment:4 Changed 4 years ago by Berislav Lopac

Has patch: set

The issue was a bit more complicated, as the validation for individual values and the overall was a bit messed up. I've got it to pass all the tests and seems to be working fine now, and there are no calls to super().validate() except from validate itself. The patch is avilable at

Version 0, edited 4 years ago by Berislav Lopac (next)

comment:5 Changed 4 years ago by Simon Charette

Needs tests: set

Could you add a failing testcase to the patch based on your provided example?

comment:6 Changed 4 years ago by lucasicf

This ticket is inactive for 5 weeks, can I help here?

It took me a lot of time to figure out what was the actual problem.
I thought the solution was to call self.validate() instead of super().validate() inside to_python().
However, by reading the sent patch, I noticed that the solution is not to call any validate() at all, since this is not done by any other field class.
If I'm right, the failing test I wrote covers this problem. The test is failing in the master, but working after applying the patch sent by BerislavLopac.

Here is the test patch:

I also regenerated the BerislavLopac's patch in the current master, since it got outdated in 5 weeks:

Hope I could help, I'm a new contributor in django.

comment:7 Changed 4 years ago by anonymous

Hey thanks -- I got quite busy in the past month and I didn't have the time to create the failing test. :-(

comment:8 Changed 4 years ago by Berislav Lopac

Sorry, the previous comment was by me, I didn't notice that I'm not logged in.

comment:9 Changed 4 years ago by Claude Paroz

I must say I don't like the valid_value duplication in the proposed patch. Note that I just proposed a patch for #20039 which also addresses this issue.

comment:10 Changed 4 years ago by Claude Paroz <claude@…>

Resolution: fixed
Status: assignedclosed

In 9883551d50e105b324d8071232bf420935844e43:

Fixed #20039 -- Fixed has_changed form detection for required TypedChoiceFields

Thanks Florian Apolloner for the report and the review.
Also fixes #19643.

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