2014-10-07 19 views
6

Her bir alana bir filtre eklemeden, WTForms'daki tüm değerlerden çevreleyen boşlukları kesmenin bir yolu var mı? WTForms'ta tüm değerleri otomatik olarak şeritle()?

Şu benim alanlara aşağıda gösterilen fonksiyonu ile filters=[strip_whitespace] geçen ama her alan için bu tekrarlamak yaşıyorum oldukça çirkin. Zaten uygulamada olduğu yapıyorum beri

def strip_whitespace(s): 
    if isinstance(s, basestring): 
     s = s.strip() 
    return s 

Form ait subclassing gerektiren bir çözüm iyi olurdu.

cevap

8

Sen WTForms 2.x yapabiliriz class Meta üzerinde bind_field ilkel kullanarak. class Meta paradigması, WTForms davranışlarını, alanları bağlama, örnek oluşturma alanları ve daha fazlası gibi bağlamlarda geçersiz kılmanın bir yoludur.

bir form üzerinde tanımlı class Meta geçersiz şey herhangi bir biçimde alt sınıflarına miras olduğu için, istediğiniz davranışları ile bir baz formu sınıfını ayarlamak için kullanabilirsiniz: sadece herkes için MyBaseForm miras, Şimdi

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 

Formlarınız ve gitmek için iyisiniz.

+0

(WTForms bunlar fazlasıyla mevcut). Ayrıca, bu satır biraz basitleştirilebilir: 'filtreleri = unbound_field.kwargs.get ('filtreler', []) ' – ThiefMaster

+0

@ThiefMaster sayesinde, kod örneği – Crast

+0

FormField filtreleri alamaz gibi bu FormField'' da yapılamaz çözecektir , yani issubclass (unbound_field.field_class, FormField) ' – gdoumenc

1

formu sınıflara göre bunu yapıp yapamayacağını şaşırmam ama benim çözüm sadece özel Stripped * alanlar yaratmaktı. Bu daha az hata eğilimli olduğu için filtreleri her zaman geçirmeden en az iyi olduğunu düşünüyorum:

from wtforms import StringField, PasswordField 


class Stripped(object): 
    def process_formdata(self, valuelist): 
     if valuelist: 
      self.data = valuelist[0].strip() 
     else: 
      self.data = '' 

class StrippedStringField(Stripped, StringField): pass 
class StrippedPasswordField(Stripped, PasswordField): pass 
+0

Değil gerçekten her alanını sınıflara gerektirir çünkü iyi bir çözüm ben 'yerine' pop' veya birinci Form ancak herhangi herhangi özel filtreler olmaz ait get' gerektiğini düşünüyorum – ThiefMaster

0

Ne yazık ki, ilk tepkiyi yorum yapmak hiçbir yeterli bir üne sahiptir. Ama derece tatsız hata olduğunu örnekte vardır: Eğer 1 öğe tarafından her form başlatma filtreler büyümesi üzerine daha sonra filters.append (yetiremediğin) yaptığınızda. Eğer

Örnek düşünün Yeniden başlatana kadar sonucunda , kodunuz ve yavaş yavaş çalışır: Çok hızlı bir düzeltmedir

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 

kontrol etmek o listedeki bu filtre değil:

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) 
İlgili konular