使用web2py模仿输入的HTML5模式属性的行为?

时间:2012-04-11 22:12:59

标签: python html5 web2py web2py-modules

我希望用HTML5和模式属性验证我的所有表单,但是一如既往,互联网上没有什么是完美的,我仍然需要备份来捕获那些不使用HTML5友好浏览器的用户。

我很难在手册中找到正则表达式的确切表示,所以如果你知道,我会感激一些帮助。我已经用两种方式编写代码,HTML方式和HTML帮助方式(见下文),HTML5在现代浏览器中工作和验证,除了预期的IE,但我不能将它们翻译成python。

一个例子,你将在下面看到,是表达式pattern="[A-F0-9]{11}|[A-F0-9]{14}" 这有效地强制输入仅包含A-F的大写字母和数字0-9。它还确保长度正好是11个字符或14.所以我如何在web2py中使用它? IS_LENGTH似乎只接受我测试的范围,到目前为止我只发现IS_ALPHANUMERIC来控制接受哪些字符。

请参阅以下表格:

HTML:

<form id="activate_form" method="post" action="">
    <label for="meid">MSIE/ESN <sup>*</sup></label>
    <input name="meid" pattern="[A-Fa-f0-9]{11}|[A-Fa-f0-9]{14}" placeholder="MEID/ESN" required />
    <br />
    <label for="zip">Zip Code <sup>*</sup></label>
    <input type="number" name="zip" pattern="{5}" placeholder="Zip Code" required />
    <br />
    <br />
    <br /><br />
    <input type="button" name="cancel" value="Cancel" onClick="history.go(-1);return true;" />
    <input type="submit" name="submit" value="Activate" />
       <p class="small"><sup>*</sup> denotes a required field.
</form>

HTML助手:

form=FORM(LABEL('MEID/ESN ',(SPAN('*'))),INPUT(_name='meid',_pattern="[A-F0-9]{11}|[A-F0-9]{14}",_placeholder='MEID/ESN',_required='required',_title="The MEID/ESN number only contains 11 or 13 characters, the letters A-F, and the numbers 0-9.",requires=[IS_LENGTH(11|14),IS_NOT_EMPTY()], _onblur="this.checkValidity();"),BR(),LABEL('ZIP CODE ',(SPAN('*'))),INPUT(_name='zip',_type='number',_pattern="[0-9]{5}",_placeholder='Zip Code',_required='required',_title="We only required the five character zip code.",requires=IS_NOT_EMPTY()),BR(),BR(),BR(),BR(),INPUT(_type='button',_name='cancel',_value='Cancel',_onclick="history.go(-1);return true;"),INPUT(_type='submit',_name='submit',_value='Activate'),_method='post',_id='activate_form')
    if form.accepts(request,session):
        response.flash = 'Form accepted'
     #   redirect(URL('next'))
    elif form.errors:
        response.flash = 'Form has errors'
    return dict(form=form)

2 个答案:

答案 0 :(得分:1)

如果您想坚持使用客户端验证,您可能还会考虑像Webshims Lib这样的Javascript polyfill库,它允许您在旧版浏览器中使用HTML5功能。另请注意,虽然客户端验证可以改善用户体验,但它不能防止恶意攻击,因此您可能还需要进行一些服务器端验证。

无论如何,对于服务器端模式验证,您可以使用IS_MATCH()验证程序。例如:

IS_MATCH('[A-F0-9]{11}|[A-F0-9]{14}', strict=True)

这将匹配字符串的开头,设置strict=True也需要匹配字符串的结尾(相当于在正则表达式的末尾添加“$”)。如果您不想匹配字符串的开头,而是在字符串中的任何位置搜索模式,则可以设置search=True

答案 1 :(得分:1)

我认为你没有看到合适的验证器。你可以在你的情况下使用IS_MATCH():

requires=IS_MATCH('^(\w{11}|\w{14})$')

查看book处的验证人列表,还有其他可能感兴趣的列表。此外,当您处理所提供的验证器都不起作用的专业字段时,实现您自己的easy非常{= 3}

web2py的源代码非常友好,我建议您在书上找不到答案时直接查看代码,这并不总是最新的。可能是他们现在更新了这本书,但我记得前一段时间我检查了验证器的来源,那里还有一些有趣的验证器尚未记录。我读了如何实现FORM帮助器,它帮助我解释了它周围的“神奇”,并使我有可能实现一些非常疯狂的东西,否则我将重新发明轮子,就像实现我自己的ajax专门与CSRF保护兼容的表格。