代码之家  ›  专栏  ›  技术社区  ›  KAYAKMAHN

如何使用%{name}s python将发布的webapp2值与表单中的字符串进行比较

  •  0
  • KAYAKMAHN  · 技术社区  · 9 年前

    我是一个python新手,使用wepapp2作为python 2.7.5和Mssql server express 2012的独立版本。

    目前,我正在尝试为自己构建一个简单的网页,而不需要框架。它是导入到表单处理程序中的表单。当缺少必填字段时,处理程序使用字符串格式来保存表单值,但我在保留select元素的值时遇到了问题。

    调试显示,val类型为“str”,当使用%(status)r'输出到HTML时,值为u'o',但val的长度等于10。我认为这就是val=='o'为假的原因,但为什么?如何使下面的条件语句结果为True?谢谢

    表单处理程序.py

    class TaskFormHandler(webapp2.RequestHandler):
        def post(self):
          ...
          col = self.request.get(field)
          ...
          if error_flag:
            self.write_display(error_flag,fields[0],...)
    
        def write_display(self,error='',status='',...):
           form_vals = {'error':error,'status':status,...}
           self.response.write(webview.form % form_vals)
    

    webview.py

    from string import Template
    
        val = '%(status)s'
        if val == 'o':
            params = dict(op1=' selected',op2='',op3='')
        elif val == 'c':
            params = dict(op1='',op2=' selected',op3='')
        elif val == 'a':
            params = dict(op1='',op2='',op3=' selected')
        else:
            params = dict(op1='',op2=' selected',op3=len(val))
    
        template = Template("""
            <label>Temp_Status
                <select name='status'>
                    <option value='o'${op1}>Opened</option>
                    <option value='c'${op2}>Completed</option>
                    <option value='a'${op3}>Aged</option>
                </select>
            </label><br><br>
            """)
    
        form = """
    <form method='post' action='/tasksystem/taskform'>
    ...
    ...
    """ + template.substitute(params) + """
    ...
    ...
    </form>
    """
    

    这是网页页面源的输出:

    <label>Temp_Status
            <select name='status'>
                <option value='o'>Opened</option>
                <option value='c' selected>Completed</option>
                <option value='a'10>Aged</option>
            </select>
        </label><br><br>
    
    2 回复  |  直到 9 年前
        1
  •  0
  •   Hendrik    9 年前

    我不知道webapp2,但10是 %(status)s 。正确的是 val = str(status) 我认为这是第一线。或者简单地检查 status == XX

        2
  •  0
  •   KAYAKMAHN    9 年前

    在发布了这个新解决方案并将其与旧解决方案进行比较后,我现在相信旧解决方案 无法工作,因为“%(status)s”从未在替换文本字符串的上下文中使用。正如@Hendrik所指出的,它实际上被用作字符串本身,并且失败了,因为“o”==“%(status)s”为false。

    这解释了为什么我在网页源代码中看到op1=“%(status)s”的值,因为params被连接到表单文本中并由模板类呈现。难以置信的我希望这篇文章能帮助那些寻找纯python解决方案的人在没有框架的情况下保留HTMLSELECT元素值。发送

    表单处理程序.py

    class TaskFormHandler(webapp2.RequestHandler):
        ...
        def write_display(self,error='',status='',...):
           if status == 'o':
                op1,op2,op3 = ' selected','',''
           elif status == 'c':
                op1,op2,op3 = '',' selected',''
           elif status == 'a':
                op1,op2,op3 = '','',' selected'
           else:
                op1,op2,op3 = '','','selected'
           form_vals = {'error':error,'status':status,'op1':op1,...}
           self.response.write(webview.form % form_vals)
    

    webview.py

    from string import Template
    
        params = dict(op1='%(op1)s',op2='%(op2)s',op3='%(op3)s')
        template = Template("""
            <label>Temp_Status
                <select name='status'>
                    <option value='o'${op1}>Opened</option>
                    <option value='c'${op2}>Completed</option>
                    <option value='a'${op3}>Aged</option>
                </select>
            </label><br><br>
            """)
    
        form = """
    <form method='post' action='/tasksystem/taskform'>
    ...
    """ + template.substitute(params) + """
    ...
    </form>
    """