`
剑事
  • 浏览: 62094 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

为 sqlalchemy model 生成 html form

阅读更多

class Servicelog(Base):

    __tablename__ = 'k_servicelog'

    id = Column(Integer, primary_key=True)

    question = Column(String(360),index=True)

    answer = Column(String(300))

    solution = Column(String(300))

    createime = Column(DATETIME,default=datetime.datetime.now(),index=True) 

    endtime= Column(DATETIME,index=True)

    feedback = Column(BOOLEAN,index=True)

    servicestatus = Column(Integer,index=True)

 

 

    def __init__(self,question='',answer='',feedback=0,servicestatus=0):

        self.question = answer

        self.answer = answer 

        self.solution = ''

        self.feedback = feedback 

        self.servicestatus = servicestatus       

 

 

 

    def fieldtypes(self):

        list = {'question':FormTextarea('question',label='Question',need=True),

                'answer':FormTextarea('answer',label='Answer'),

                'solution':FormTextarea('solution',label='Solution'),

                'feedback':FormCheckbox('feedback',label='Service status'),

                'servicestatus':FormRadio('servicestatus',{'none':'0','need':'1','tk':'2'}),

        }

        return list

def fieldtypes(self) 是附加的方法 定义了要生成form 的字段  包括验证信息

 

 

class toform:

    fields = {}

    param = {}

    types = {}

    def __init__(self,model):

        self.param = model.__dict__

        self.types = model.fieldtypes()

 

        try:

            for f in self.types:

 

                if self.types.has_key(f):

                    self.types[f].value = self.param[f]

                    self.fields[f] = self.types[f]

                else: 

                    self.fields[f] = '<input type="text" name="%s" value="%s">'%(f,self.param[f])

        except Exception,error:

            print error

 

 

    def as_l(self):

        aslabel = ''

        for k in self.fields:

            #print type(self.fields[k]),type(self.types[k].label)

            aslabel += '<label><b>%s:</b> %s<br/></label>'%(''.join(self.types[k].label),self.fields[k])

        return aslabel 

 

    def valid(self):

        ok = True

        for k in self.fields:

            self.fields[k].valid()

            if self.fields[k].error:

                ok = False

        return ok

 

 

 

 

class FormText:

    name = ''

    value = ''

    label = ''

    error = ''

    kwargs = {}

    def __init__(self,name,label = '',**kwargs):

        self.name = name

        self.label = label

        self.kwargs = kwargs

    def render(self):

        return u'<input type="text" name="%s" value="%s"> '%(self.name,self.value or '')

    def __unicode__(self):

        return self.render()

 

    def withlabel(self):

        return u'<label for="%s"><b>%s:</b><input type="text" name="%s" value="%s"><br/> %s</label>'%(self.name,self.label,self.name,self.value or '',self.error)

 

    def valid(self):

        if self.kwargs.get('need',False) and self.value=='':

            self.error = _('This field is required.')

            return

 

        if self.kwargs.has_key('minlength'):

            if(len(self.value)<self.kwargs.get('minlength')):

                self.error = _('This field min length is.')

                return

        if self.kwargs.has_key('maxlength'):

            if(len(self.value)<self.kwargs.get('maxlength')):

                self.error = _('This field min length is.')

                return

class FormTextarea:

    name = ''

    value = ''

    label = ''

    error = ''

    cols = 10

    rows = 5

    kwargs = {}

    def __init__(self,name,cols=10,rows=5,label = '',**kwargs):

        self.name = name

        self.cols = cols

        self.rows = rows

        self.label = label

        self.kwargs = kwargs

    def render(self):

        return u'<textarea name="%s" cols="%s" rows="%s">%s</textarea>'%(self.name,self.cols,self.rows,self.value)

 

    def valid(self):

        if self.kwargs.get('need',False) and self.value=='':

            self.error = _('This field is required.')

            return

 

        if self.kwargs.has_key('minlength'):

            if(len(self.value)<self.kwargs.get('minlength')):

                self.error = _('This field min length is.')

                return

 

        if self.kwargs.has_key('maxlength'):

            if(len(self.value)<self.kwargs.get('maxlength')):

                self.error = _('This field min length is.')

                return

    def __unicode__(self):

        return self.render()

 

    def withlabel(self):

 

        return u'<label for="%s"><b>%s:</b>%s<br/> %s</label>'%(self.name,self.label,self.render(),self.error)

 

 

class FormCheckbox:

    name = ''

    value = ''

    error = ''

    kwargs = {}

    def __init__(self,name,label = '',**kwargs):

        self.name = name

        self.label = label

        self.kwargs = kwargs

    def render(self):

        check = ''

        if int(self.value) == 1:

            check = 'checked' 

        return '<input type="checkbox" name="%s" value="1" %s>'%(self.name,check)

    def valid(self):

        if self.kwargs.get('need',False) and self.value=='':

            self.error = _('This field is required.')

    def __unicode__(self):

        return self.render()

 

class FormRadio:

    name = ''

    value = ''

    label = ''

    error = ''

    option = {}

    kwargs = {}

    def __init__(self,name,option,label = '',**kwargs):

        self.name = name

        self.option = option

        self.label = label

        self.kwargs = kwargs

    def render(self):

        check = ''

        html = ''

 

        for k in self.option:

            if self.value == self.option[k]:

                check = 'checked' 

            else:

                check = ''

            html += '<label><input class="f-radio" type="radio" name="%s" value="%s" %s> %s</label>'%(self.name,self.option[k],check,k)

        return html

    def valid(self):

        if self.kwargs.get('need',False) and self.value=='':

            self.error = _('This field is required.')

    def __unicode__(self):

        return self.render()

使用起来如下

 

 

form = toform(Servicelog())

 

form.valie() #验证数据

 

form.as_l #输出form内各元素

 

form.fields.question #输出单个字段 并带 label

 

form.fields.question.withlabel  #输出单个字段 并带 label,错误提示


分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics