2013-04-26 32 views
7

Tôi tạo ra một hình thức tùy chỉnh với xác nhận tùy chỉnh như thế này:Django làm thế nào để ghi đè lên phương thức clean() trong một phân lớp của biểu mẫu tùy chỉnh?

class MyCustomForm(forms.Form): 
    # ... form fields here 

    def clean(self): 
     cleaned_data = self.cleaned_data 
     # ... do some cross-fields validation here 

     return cleaned_data 

Bây giờ, hình thức này được subclassed bằng một hình thức trong đó có phương pháp riêng của mình sạch sẽ.
Cách chính xác để kích hoạt cả hai phương thức clean() là gì?
Tại thời điểm này, đây là những gì tôi làm:

class SubClassForm(MyCustomForm): 
    # ... additional form fields here 

    def clean(self): 
     cleaned_data = self.cleaned_data 
     # ... do some cross-fields validation for the subclass here 

     # Then call the clean() method of the super class 
     super(SubClassForm, self).clean() 

     # Finally, return the cleaned_data 
     return cleaned_data 

Có vẻ như để làm việc. Tuy nhiên, điều này làm cho hai phương thức clean() trả về cleaned_data mà dường như đối với tôi hơi lạ.
Đây có phải là cách chính xác không?

+0

Bạn đang làm việc đó một cách chính xác. –

Trả lời

12

Bạn làm điều đó tốt, nhưng bạn nên tải cleaned_data từ siêu gọi như thế này:

class SubClassForm(MyCustomForm): 
# ... additional form fields here 

def clean(self): 
    # Then call the clean() method of the super class 
    cleaned_data = super(SubClassForm, self).clean() 
    # ... do some cross-fields validation for the subclass 

    # Finally, return the cleaned_data 
    return cleaned_data 
+0

Cảm ơn @Mounir. Tuy nhiên, một câu hỏi: cách bạn đề xuất, 'cleaned_data' sẽ chứa các trường từ lớp siêu. Tôi cũng cần xác nhận các trường trên lớp con. Tôi phải làm nó như thế nào? – user1102018

+0

để tiếp tục nhận xét của tôi, có lẽ nên có một cái gì đó như: 'cleaned_sub_data = self.cleaned_data' theo sau là' cleaned_data.update (cleaned_sub_data) '. Sau đó, tôi có thể trả về 'cleaned_data' – user1102018

Các vấn đề liên quan