Переопределение функции в Python - PullRequest
0 голосов
/ 24 февраля 2012

У меня есть следующий базовый класс (сокращенный код):

class SignupForm(GroupForm):

    username = forms.CharField(
        label = _("Username"),
        max_length = 30,
        widget = forms.TextInput()
    )

    def __init__(self, *args, **kwargs):
        super(SignupForm, self).__init__(*args, **kwargs)
        if REQUIRED_EMAIL or EMAIL_VERIFICATION or EMAIL_AUTHENTICATION:
            self.fields["email"].label = ugettext("Email")
            self.fields["email"].required = True
        else:
            self.fields["email"].label = ugettext("Email (optional)")
            self.fields["email"].required = False


    def after_signup(self, user, **kwargs):
        """
        An extension point for subclasses.
        """
        pass

Я хочу переопределить функцию after_signup() и поле username следующим образом:

class CompanySignupForm(SignupForm):
    #TODO: override fields for company signup form

    username = forms.CharField(
        label = _("Username TEST"),
        max_length = 30,
        widget = forms.TextInput()
    )

    def after_signup(self, user, **kwargs):
        """
        An extension point for subclasses.
        """
        print str('after_signup is has been overwritten')

Моя проблема: Только поле имени пользователя показывает желаемое поведение. Функция after_signup() никогда не вызывается. Вместо этого вызывается функция after_signup() базового класса SignupForm. Что я делаю не так?

EDIT:

the imports: 
from django import forms 
from django.contrib.auth.models import User 
from django.utils.translation import ugettext_lazy as _, ugettext

создание экземпляра CompanySignupForm:

url(r"^signup/$", CompanySignupForm.as_view(), name="acct_signup")

after_signup () вызывается из функции в базовом классе:

def save(self, request=None): 
    # more code here
    # ...
    self.after_signup(new_user)

1 Ответ

0 голосов
/ 25 февраля 2012

Используйте isinstance() для проверки типа экземпляра и .__class__, чтобы убедиться, что вы создаете экземпляр CompanySignupForm.

Также вы можете захотеть создать __init__ метод для CompanySignupForm, чтобы убедиться, что он не просто создает экземпляр суперкласса.

Примечание.функция базового класса сохранить правильно?Затем он вызовет свой локальный метод after_signup, если он существует.Я бы взял эту функцию из базового класса и заставил бы ее вызывать унаследованные функции

Чтобы проверить версию, запустите:

signup = CompanySignupForm.as_view()
print signup.__class__

url(r"^signup/$", signup, name="acct_signup")
...