2013-01-24 13 views
7

WTForms दस्तावेज़ दुर्भाग्य से अपर्याप्त है, वे आपको एक कस्टम विजेट का एक भी उदाहरण भी नहीं दिखाते हैं जो पहले से ही किसी अन्य विजेट से नहीं लिया गया है।WTForms एक कस्टम विजेट बनाते हैं

सबमिट = InlineButton (name = 'प्रस्तुत', type = 'प्रस्तुत', शीर्षक = 'इस पेज को बचाओ:

मैं एक बटन प्रकार बनाने के लिए कोशिश कर रहा हूँ, कि "इनपुट" html में नहीं है ', textWithinSpan =' सहेजें ')

from flask.ext.wtf import Required, Length, EqualTo, Field, TextInput, html_params 
from flask import Markup 

class InlineButtonWidget(object): 
    text = '' 
    html_params = staticmethod(html_params) 

    def __init__(self, input_type='submit', **kwargs): 
    self.input_type = input_type 

    def __call__(self, field, **kwargs): 
    kwargs.setdefault('id', field.id) 
    kwargs.setdefault('type', self.input_type) 
    if 'value' not in kwargs: 
     kwargs['value'] = field._value() 
    return Markup('<button type="submit" %s><span>%s</span></button>' % (self.html_params(name=field.name, **kwargs), kwargs['textWithinSpan'])) 


class InlineButton(Field): 
    widget = InlineButtonWidget() 

    def __init__(self, label='', **kwargs): 
    self.widget = InlineButtonWidget('submit', label) 
    def __call__(self, **kwargs): 
    return self.widget(self, **kwargs) 
    def _value(self): 
    if self.data: 
     return u', '.join(self.data) 
    else: 
     return u'' 


class SignupForm(Form): 
    name = TextField('Name', [Length(min=1, max=200)]) 
    submit = InlineButton(name='submit', type='submit', title='Save this page', textWithinSpan='Save') 

मैं भी एक फील्ड ली गई वस्तु की जरूरत नहीं होनी चाहिए। लेकिन यह तब प्रदर्शित नहीं होता है जब आप केवल विजेट का उपयोग करते हैं।

और जब आप फील्ड ऑब्जेक्ट का उपयोग करते हैं, तो यह आपको सभी प्रकार की अमान्य पैरामीटर त्रुटियों देता है।

डब्ल्यूटीएफएफएस स्रोत कोड में भी डूबने से यह समझना मुश्किल हो जाता है कि यह फॉर्म से विजेट तक क्वार्ग क्यों नहीं पारित करेगा।

--- अद्यतन ---

ठीक है, के बाद मैं सवाल मैं मूल रूप से समस्या का समाधान पता लगा सबमिट करें:

class InlineButtonWidget(object): 
    html_params = staticmethod(html_params) 

    def __init__(self, input_type='submit', text=''): 
     self.input_type = input_type 
     self.text = text 

    def __call__(self, field, **kwargs): 
     kwargs.setdefault('id', field.id) 
     kwargs.setdefault('type', self.input_type) 
     if 'value' not in kwargs: 
      kwargs['value'] = field._value() 
     return Markup('<button type="submit" %s><span>%s</span></button>' % (self.html_params(name=field.name, **kwargs), field.text)) 


class InlineButton(Field): 
    widget = InlineButtonWidget() 

    def __init__(self, label=None, validators=None, text='Save', **kwargs): 
    super(InlineButton, self).__init__(label, validators, **kwargs) 
    self.text = text 

    def _value(self): 
     if self.data: 
      return u''.join(self.data) 
     else: 
      return u'' 



class SignupForm(Form): 
    name = TextField('Name', [Length(min=1, max=200)]) 
    submit = InlineButton('submit', text='Save', description='Save this') 

उत्तर

3

अद्यतन के तहत उत्तर दिया, लेकिन इस init जरूरत अंदर फील्ड व्युत्पन्न कक्षा।

def __init__(self, label=None, validators=None, text='Save', **kwargs): 
    super(InlineButton, self).__init__(label, validators, **kwargs) 
    self.text = text 
4

आप इस उदाहरण के लिए क्षेत्र पर उपयोगी विशेषताओं, अर्थात् 'विवरण' और 'लेबल' का लाभ उठा सकते हैं।

from wtforms.widgets.core import HTMLString, html_params, escape 

class InlineButtonWidget(object): 
    def __call__(self, field, **kwargs): 
     kwargs.setdefault('type', 'submit') 
     # Allow passing title= or alternately use field.description 
     title = kwargs.pop('title', field.description or '') 
     params = html_params(title=title, **kwargs) 

     html = '<button %s><span>%s</span></button>' 
     return HTMLString(html % (params, escape(field.label.text))) 

उपयोग:: यह एक बहुत सरल सेटअप पैदावार (पठनीयता के लिए लिपटे)

class MyForm(Form): 
    foo = BooleanField(
     u'Save', 
     description='Click here to save', 
     widget=InlineButtonWidget() 
    ) 

बारी-बारी से, इसके लिए एक फ़ील्ड प्रकार है:

class InlineButtonField(BooleanField): 
    widget = InlineButtonWidget() 

class MyForm(Form): 
    foo = InlineButtonField('Save', description='Save Me') 
संबंधित मुद्दे