如何使用 %{name}s python 将发布的 webapp2 值与表单中的字符串进行比较
How to compare posted webapp2 value to string in a form using %{name}s python
我是一个 python 新手,使用 python 2.7.5 和 Mssql server express 2012 独立使用 wepapp2。
目前,我正在尝试为自己构建一个没有框架的简单网页。它是导入到表单处理程序中的表单。当缺少必填字段时,处理程序使用字符串格式来保留表单值,但我在保留 select 元素的值时遇到问题。
调试显示 val 类型为 'str',当使用 %(status)r' 输出到 HTML 时,值为 u'o',但 val 的长度等于10. 我假设这就是 val == 'o' 为假的原因,但为什么呢?我怎样才能使下面的条件语句的结果为真?谢谢
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)
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>
在发布这个新解决方案并将其与旧解决方案进行比较后,我现在相信旧解决方案
不起作用,因为“%(status)s”从未在用于替换的文本字符串的上下文中使用。正如@Hendrik 指出的那样,它实际上被用作字符串本身并且失败了,因为 'o'=='%(status)s' 是错误的。
这解释了为什么我在网页源代码中看到 op1='%(status)s' 的值,因为 params 被连接到表单文本中并由模板 class 呈现。难以置信的!我希望这篇文章可以帮助那些寻找纯 python 解决方案的人,以在没有框架的情况下保留 HTML SELECT 元素值。发送
formhandler.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>
"""
我不知道 webapp2,但是 10 是 %(status)s
的长度。我认为正确的是 val = str(status)
作为第一行。或者简单地检查 status == XX
我是一个 python 新手,使用 python 2.7.5 和 Mssql server express 2012 独立使用 wepapp2。
目前,我正在尝试为自己构建一个没有框架的简单网页。它是导入到表单处理程序中的表单。当缺少必填字段时,处理程序使用字符串格式来保留表单值,但我在保留 select 元素的值时遇到问题。
调试显示 val 类型为 'str',当使用 %(status)r' 输出到 HTML 时,值为 u'o',但 val 的长度等于10. 我假设这就是 val == 'o' 为假的原因,但为什么呢?我怎样才能使下面的条件语句的结果为真?谢谢
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)
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>
在发布这个新解决方案并将其与旧解决方案进行比较后,我现在相信旧解决方案 不起作用,因为“%(status)s”从未在用于替换的文本字符串的上下文中使用。正如@Hendrik 指出的那样,它实际上被用作字符串本身并且失败了,因为 'o'=='%(status)s' 是错误的。
这解释了为什么我在网页源代码中看到 op1='%(status)s' 的值,因为 params 被连接到表单文本中并由模板 class 呈现。难以置信的!我希望这篇文章可以帮助那些寻找纯 python 解决方案的人,以在没有框架的情况下保留 HTML SELECT 元素值。发送
formhandler.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>
"""
我不知道 webapp2,但是 10 是 %(status)s
的长度。我认为正确的是 val = str(status)
作为第一行。或者简单地检查 status == XX