为 sqlalchemy model 生成 html form

 下面是一个测试的 sqlalchemy model
  1. class Servicelog(Base):
  2.     __tablename__ = 'k_servicelog'
  3.     id = Column(Integer, primary_key=True)
  4.     question = Column(String(360),index=True)
  5.     answer = Column(String(300))
  6.     solution = Column(String(300))
  7.     createime = Column(DATETIME,default=datetime.datetime.now(),index=True
  8.     endtime= Column(DATETIME,index=True)
  9.     feedback = Column(BOOLEAN,index=True)
  10.     servicestatus = Column(Integer,index=True)
  11.     def __init__(self,question='',answer='',feedback=0,servicestatus=0):
  12.         self.question = answer
  13.         self.answer = answer 
  14.         self.solution = ''
  15.         self.feedback = feedback 
  16.         self.servicestatus = servicestatus       
  17.     
  18.     def fieldtypes(self):
  19.         list = {'question':FormTextarea('question',label='Question',need=True),
  20.                 'answer':FormTextarea('answer',label='Answer'),
  21.                 'solution':FormTextarea('solution',label='Solution'),
  22.                 'feedback':FormCheckbox('feedback',label='Service status'),
  23.                 'servicestatus':FormRadio('servicestatus',{'none':'0','need':'1','tk':'2'}),
  24.         }
  25.         return list
def  fieldtypes( self ) 是附加的方法 定义了要生成form 的字段  包括验证信息

  1. class toform:
  2.     fields = {}
  3.     param = {}
  4.     types = {}
  5.     def __init__(self,model):
  6.         self.param = model.__dict__
  7.         self.types = model.fieldtypes()
  8.    
  9.         try:
  10.             for f in self.types:
  11.                 if self.types.has_key(f):
  12.                     self.types[f].value = self.param[f]
  13.                     self.fields[f] = self.types[f]
  14.                 else
  15.                     self.fields[f] = '<input type="text" name="%s" value="%s">'%(f,self.param[f])
  16.         except Exception,error:
  17.             print error
  18.     def as_l(self):
  19.         aslabel = ''
  20.         for k in self.fields:
  21.             #print type(self.fields[k]),type(self.types[k].label)
  22.             aslabel += '<label><b>%s:</b> %s<br/></label>'%(''.join(self.types[k].label),self.fields[k])
  23.         return aslabel 
  24.     
  25.     def valid(self):
  26.         ok = True
  27.         for k in self.fields:
  28.             self.fields[k].valid()
  29.             if self.fields[k].error:
  30.                 ok = False
  31.         return ok
  32.                
  33.             
  34. class FormText:
  35.     name = ''
  36.     value = ''
  37.     label = ''
  38.     error = ''
  39.     kwargs = {}
  40.     def __init__(self,name,label = '',**kwargs):
  41.         self.name = name
  42.         self.label = label
  43.         self.kwargs = kwargs
  44.     def render(self):
  45.         return u'<input type="text" name="%s" value="%s"> '%(self.name,self.value or '')
  46.     def __unicode__(self):
  47.         return self.render()
  48.     
  49.     def withlabel(self):
  50.         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)
  51.     
  52.     def valid(self):
  53.         if self.kwargs.get('need',Falseand self.value=='':
  54.             self.error = _('This field is required.')
  55.             return
  56.             
  57.         if self.kwargs.has_key('minlength'):
  58.             if(len(self.value)<self.kwargs.get('minlength')):
  59.                 self.error = _('This field min length is.')
  60.                 return
  61.         if self.kwargs.has_key('maxlength'):
  62.             if(len(self.value)<self.kwargs.get('maxlength')):
  63.                 self.error = _('This field min length is.')
  64.                 return
  65. class FormTextarea:
  66.     name = ''
  67.     value = ''
  68.     label = ''
  69.     error = ''
  70.     cols = 10
  71.     rows = 5
  72.     kwargs = {}
  73.     def __init__(self,name,cols=10,rows=5,label = '',**kwargs):
  74.         self.name = name
  75.         self.cols = cols
  76.         self.rows = rows
  77.         self.label = label
  78.         self.kwargs = kwargs
  79.     def render(self):
  80.         return u'<textarea name="%s" cols="%s" rows="%s">%s</textarea>'%(self.name,self.cols,self.rows,self.value)
  81.     
  82.     def valid(self):
  83.         if self.kwargs.get('need',Falseand self.value=='':
  84.             self.error = _('This field is required.')
  85.             return
  86.             
  87.         if self.kwargs.has_key('minlength'):
  88.             if(len(self.value)<self.kwargs.get('minlength')):
  89.                 self.error = _('This field min length is.')
  90.                 return
  91.                 
  92.         if self.kwargs.has_key('maxlength'):
  93.             if(len(self.value)<self.kwargs.get('maxlength')):
  94.                 self.error = _('This field min length is.')
  95.                 return
  96.     def __unicode__(self):
  97.         return self.render()
  98.     
  99.     def withlabel(self):
  100.         return u'<label for="%s"><b>%s:</b>%s<br/> %s</label>'%(self.name,self.label,self.render(),self.error)
  101.     
  102.     
  103. class FormCheckbox:
  104.     name = ''
  105.     value = ''
  106.     error = ''
  107.     kwargs = {}
  108.     def __init__(self,name,label = '',**kwargs):
  109.         self.name = name
  110.         self.label = label
  111.         self.kwargs = kwargs
  112.     def render(self):
  113.         check = ''
  114.         if int(self.value) == 1:
  115.             check = 'checked' 
  116.         return '<input type="checkbox" name="%s" value="1" %s>'%(self.name,check)
  117.     def valid(self):
  118.         if self.kwargs.get('need',Falseand self.value=='':
  119.             self.error = _('This field is required.')
  120.     def __unicode__(self):
  121.         return self.render()
  122.     
  123. class FormRadio:
  124.     name = ''
  125.     value = ''
  126.     label = ''
  127.     error = ''
  128.     option = {}
  129.     kwargs = {}
  130.     def __init__(self,name,option,label = '',**kwargs):
  131.         self.name = name
  132.         self.option = option
  133.         self.label = label
  134.         self.kwargs = kwargs
  135.     def render(self):
  136.         check = ''
  137.         html = ''
  138.         
  139.         for k in self.option:
  140.             if self.value == self.option[k]:
  141.                 check = 'checked' 
  142.             else:
  143.                 check = ''
  144.             html += '<label><input class="f-radio" type="radio" name="%s" value="%s" %s> %s</label>'%(self.name,self.option[k],check,k)
  145.         return html
  146.     def valid(self):
  147.         if self.kwargs.get('need',Falseand self.value=='':
  148.             self.error = _('This field is required.')
  149.     def __unicode__(self):
  150.         return self.render()
使用起来如下

  1. form = toform(Servicelog())
  2. form.valie() #验证数据
  3. form.as_l #输出form内各元素
  4. form.fields.question #输出单个字段 并带 label
  5. form.fields.question.withlabel  #输出单个字段 并带 label,错误提示

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值