Co można zrobić, to po prostu wywołać metodę rodzica bezpośrednio:
@parsleyfy
class AccountForm(forms.ModelForm):
def save(self, *args, **kwargs):
# some other code...
return forms.ModelForm.save(self, *args,**kwargs)
Należy starannie unikać problemu wprowadzonego przez klasy dekoratora. Innym rozwiązaniem byłoby ręcznie wywołać dekorator na różnie nazwie klasy bazowej, zamiast @
składnię:
class AccountFormBase(forms.ModelForm):
def save(self, *args, **kwargs):
# some other code...
return super(AccountFormBase, self).save(*args,**kwargs)
AccountForm = parsleyfy(AccountFormBase)
Jednakże, można także rozważyć przy użyciu pre-save signal zamiast, w zależności od tego, co starasz się do - tak zwykle dodaje się funkcje, które powinny się zdarzyć przed resztą procesu zapisywania modelu w Django.
chodzi o dlaczego ten występuje, należy rozważyć, co się dzieje, gdy kod jest oceniany.
Najpierw deklarowana jest klasa. Odwołujemy się do tej oryginalnej definicji klasy jako Foo
, aby odróżnić ją od późniejszej definicji klasy, którą stworzy dekorator. Ta klasa ma metodę save
, która wykonuje wywołanie super(AccountForm, self).save(...)
.
Ta klasa jest następnie przekazywana do dekoratora, który definiuje nową klasę, którą nazwiemy Bar
, i dziedziczy po Foo
. Zatem Bar.save
jest odpowiednikiem Foo.save
- to również wywołuje super(AccountForm, self).save(...)
. Ta druga klasa jest następnie zwracana przez dekoratora.
Zwrócona klasa (Bar
) jest przypisana do nazwy AccountForm
.
Kiedy tworzysz obiekt AccountForm
, tworzysz obiekt typu Bar
. Kiedy zadzwonisz na numer .save(...)
, pokaże się Bar.save
, który jest w rzeczywistości Foo.save
, ponieważ odziedziczył po Foo
i nigdy nie został nadpisany.
Jak wcześniej wspomniano, Foo.save
dzwoni super(AccountForm, self).save(...)
. Problem polega na tym, że ze względu na dekorator klas, AccountForm
nie jest Foo
, jego rodzicem jest Bar
- i Bar
jest to Foo
.
Więc kiedy Foo.save
patrzy rodzica AccountForm
„s, robi ... Foo
. Oznacza to, że gdy próbuje wywołać .save(...)
na tym rodzica, to po prostu nakręca się, nazywając siebie, stąd niekończąca się rekursja.
Nie sądzę, że powinieneś zwrócić metodę parent save(), po prostu wykonaj super (AccountForm, self) .save (* args, ** kwargs) – PepperoniPizza
Czy jesteś pewien, że to twój rzeczywisty kod? Zwykle dzieje się tak, gdy przez pomyłkę odnosisz się do superklasy w wywołaniu "super" - np. Masz podklasę AccountForm, a w tej przesłoniętej metodzie zapisu wciąż wywołujesz 'super (AccountForm ...)' . –
Dzięki @DanielRoseman Mam zaktualizowane pytanie –