Những gì bạn có thể làm là chỉ cần gọi trực tiếp cho phương thức của cha mẹ:
@parsleyfy
class AccountForm(forms.ModelForm):
def save(self, *args, **kwargs):
# some other code...
return forms.ModelForm.save(self, *args,**kwargs)
Điều này nên tránh gọn gàng vấn đề được trình bày lớp của bạn giới thiệu. Một lựa chọn khác sẽ tự gọi trang trí trên một lớp cơ sở khác nhau được đặt tên, thay vì sử dụng @
cú pháp:
class AccountFormBase(forms.ModelForm):
def save(self, *args, **kwargs):
# some other code...
return super(AccountFormBase, self).save(*args,**kwargs)
AccountForm = parsleyfy(AccountFormBase)
Tuy nhiên, bạn cũng có thể muốn xem xét sử dụng một pre-save signal thay vào đó, tùy thuộc vào những gì bạn đang cố gắng để do - đó là cách người ta thường thêm chức năng sẽ xảy ra trước khi phần còn lại của quá trình lưu mô hình trong Django.
Đối với tại sao điều này xảy ra, hãy xem xét những gì sẽ xảy ra khi các mã được đánh giá.
Đầu tiên, một lớp học được khai báo. Chúng tôi sẽ tham khảo định nghĩa lớp gốc này là Foo
để phân biệt với định nghĩa lớp sau mà trình trang trí sẽ tạo. Lớp này có phương thức save
thực hiện cuộc gọi super(AccountForm, self).save(...)
.
Lớp này sau đó được chuyển đến trang trí, xác định lớp mới mà chúng tôi sẽ gọi Bar
và kế thừa từ Foo
. Do đó, Bar.save
tương đương với Foo.save
- nó cũng gọi số super(AccountForm, self).save(...)
. Lớp thứ hai này sau đó được trả về từ trang trí.
Lớp được trả lại (Bar
) được gán cho tên AccountForm
.
Vì vậy, khi bạn tạo đối tượng AccountForm
, bạn đang tạo đối tượng thuộc loại Bar
. Khi bạn gọi .save(...)
trên đó, nó đi và tra cứu Bar.save
, thực tế là Foo.save
vì nó được kế thừa từ Foo
và không bao giờ bị ghi đè.
Như chúng tôi đã lưu ý trước đây, Foo.save
gọi super(AccountForm, self).save(...)
. Vấn đề là do trình trang trí lớp học, AccountForm
không phải là Foo
, đó là Bar
- và Bar
của cha mẹ là Foo
.
Vì vậy, khi Foo.save
tra cứu AccountForm
's parent, it get ... Foo
. Điều này có nghĩa rằng khi nó cố gắng gọi .save(...)
trên cha mẹ đó, nó thực sự chỉ gió lên gọi chính nó, do đó các đệ quy vô tận.
Tôi không nghĩ rằng bạn có nghĩa vụ phải trả lại phương thức save() cha mẹ, chỉ cần làm siêu (AccountForm, self) .save (* args, ** kwargs) – PepperoniPizza
Bạn có chắc đó là mã thực sự của bạn? Điều này thường xảy ra nếu bạn đã nhầm lẫn gọi superclass trong cuộc gọi 'super' - ví dụ bạn thực sự có một lớp con của AccountForm, và trong phương thức save đã ghi đè đó bạn vẫn đang gọi' super (AccountForm ...) ' . –
Cảm ơn @DanielRoseman Tôi đã cập nhật câu hỏi –