Thật không may, tôi không có đủ danh tiếng để nhận xét phản hồi đầu tiên. Nhưng, có lỗi cực kỳ khó chịu trong ví dụ đó: Khi bạn thực hiện filters.append (smth) thì trên mỗi bộ lọc khởi tạo biểu mẫu theo 1 phần tử. Kết quả là, mã của bạn hoạt động chậm hơn và chậm hơn cho đến khi bạn khởi động lại nó
xem xét Ví dụ:
class MyBaseForm(Form):
class Meta:
def bind_field(self, form, unbound_field, options):
filters = unbound_field.kwargs.get('filters', [])
filters.append(my_strip_filter)
return unbound_field.bind(form=form, filters=filters, **options)
def my_strip_filter(value):
if value is not None and hasattr(value, 'strip'):
return value.strip()
return value
class MyCustomForm(MyBaseForm):
some_field = StringField(filters=[lambda x: x])
for i in range(100):
MyCustomForm(MultiDict({'some_field': 'erer'}))
print(len(MyCustomForm.some_field.kwargs['filters'])) # print: 101
Vì vậy, việc sửa chữa nhanh chóng là để kiểm tra xem bộ lọc này không có trong danh sách:
class MyBaseForm(Form):
class Meta:
def bind_field(self, form, unbound_field, options):
filters = unbound_field.kwargs.get('filters', [])
if my_strip_filter not in filters:
filters.append(my_strip_filter)
return unbound_field.bind(form=form, filters=filters, **options)
Tôi nghĩ rằng nó phải là 'get' thay vì' pop' hoặc bất kỳ, nhưng Form đầu tiên sẽ không có bất kỳ bộ lọc tùy chỉnh. Ngoài ra, dòng đó có thể được đơn giản hóa một chút: 'filters = unbound_field.kwargs.get ('filters', [])' – ThiefMaster
@ThiefMaster cảm ơn, sẽ sửa mã ví dụ – Crast
Điều này không thể thực hiện trên 'FormField' như FormField không thể lấy bộ lọc , vì vậy hãy kiểm tra trước khi 'không issubclass (unbound_field.field_class, FormField)' – gdoumenc