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

如何使用%{name}的python将发布的webapp2值与表单中的字符串进行比较,python,python-2.7,python-3.x,webapp2,Python,Python 2.7,Python 3.x,Webapp2,我是一个python新手,使用wepapp2作为python 2.7.5和Mssql server express 2012的独立版本 现在,我正在尝试为自己构建一个没有框架的简单网页。它是导入到表单处理程序中的表单。当缺少必需字段时,处理程序使用字符串格式保存表单值,但我在保留select元素的值时遇到问题 调试显示val类型为'str',当使用%(status)r'输出到HTML时,值为u'o',但val的长度等于10。我想这就是为什么val=='o'为false的原因,但是为什么呢?如何才

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

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

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

formhandler.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)
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

    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>
"""
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>
"""
从字符串导入模板
val='%(状态)s'
如果val='o':
params=dict(op1='选定',op2='',op3='')
elif val=='c':
params=dict(op1='',op2='选定',op3='')
elif val=='a':
params=dict(op1='',op2='',op3='选定')
其他:
params=dict(op1='',op2='选定',op3=len(val))
模板=模板(“”)
临时状态
开的
完整的
…岁


""") 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>
Temp\u状态
开的
完整的
…岁



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

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

formhandler.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)
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

    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>
"""
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>
"""
从字符串导入模板
params=dict(op1='%(op1)s',op2='%(op2)s',op3='%(op3)s')
模板=模板(“”)
临时状态
开的
完整的
…岁


""") form=”“” ... “+模板。替换(参数)+” ... """
我不知道webapp2,但10是
%(status)s
的长度。我认为第一行应该是
val=str(status)
。或者简单地检查一下
status==XX

我不知道webapp2,但是10是%(status)s的长度。我想第一行应该是val=str(status)。我想我还没有做好接收通知的准备。你的回答本可以避免一些挫折。然而,这表明当你不完全理解某件事时,显而易见的事情就会被忽略。问题是,我还是不明白。我的新解决方案有效,但旧的解决方案似乎也应该有效。一旦我弄明白怎么做了,我会发布更改。这样的错误很烦人,但它发生在最好的地方:)你能接受我的答案吗,我终于给出了答案。谢谢