Can please someone explain this code from the docs?

30 views
Skip to first unread message

voger

unread,
Mar 14, 2014, 5:45:29 PM3/14/14
to django...@googlegroups.com
Hi, I was reading the form validation section here
https://docs.djangoproject.com/en/dev/ref/forms/validation/ and the very
first example is this code

from django import forms
from django.core.validators import validate_email

class MultiEmailField(forms.Field):
def to_python(self, value):
"Normalize data to a list of strings."

# Return an empty list if no input was given.
if not value:
return []
return value.split(',')

def validate(self, value):
"Check if value consists only of valid emails."

# Use the parent's handling of required fields, etc.
super(MultiEmailField, self).validate(value) #<---What is this?

for email in value:
validate_email(email)

so the validate function calls super(MultiEmailField,
self).validate(value) so essentially calls itself? Why? And how is this
not ending in infinite recursion?

Shawn Milochik

unread,
Mar 14, 2014, 5:49:34 PM3/14/14
to django...@googlegroups.com
That's just the syntax for calling a method on the base class.

1. MultiEmailField is a subclass of forms.Field. 
2. forms.Field has a method named validate.
3. MultiEmailField also has a method named validate, so it overrides the one on forms.Field.

So, for MultiEmailField to call its parent's validate() method, it has to use super. That's how the subclass can use the parent's code, and add some of its own.


voger

unread,
Mar 14, 2014, 6:03:37 PM3/14/14
to django...@googlegroups.com
On 03/14/2014 11:49 PM, Shawn Milochik wrote:
> That's just the syntax for calling a method on the base class.
>
> 1. MultiEmailField is a subclass of forms.Field.
> 2. forms.Field has a method named validate.
> 3. MultiEmailField also has a method named validate, so it overrides the
> one on forms.Field.
>

Thank you. It seemed odd that the calling class name is used to call the
parent but the more I think about it the more it makes sense. super in
it self is a function that returns the parent of a given class. So it is
logical to include class in arguments list.

Camilo Torres

unread,
Mar 15, 2014, 1:13:03 PM3/15/14
to django...@googlegroups.com
Hello,

This has nothing to do with Django; super() is a Python built-in to manage calling/accessing attributes of the super class taking in account that Python supports multiple inheritance.

Regards,
Camilo
Reply all
Reply to author
Forward
0 new messages