2012-07-03 50 views
0

是否有一种简单的方法来验证用户输入表单中的独特元素?我找到了在php中执行此操作的方法(用户在表中输入查询值后),但不知道如何使用jinja2执行此操作。例如,假设用户正在注册,并且我要求所有电子邮件地址都是唯一的,在提交结果之前,我怎么能让他们知道它不是唯一的(比如:https://github.com/signup/free如果你已经是会员了,如果你输入你的电子邮件,它会告诉你它一旦进入下一行就会存在。看到很多网站这样做)?现在我可以捕获错误,但它会刷新页面,并给他们一个错误,我想让他们知道他们的表单会在提交之前失败。在这个例子中,我正在检查一些不存在的东西,但在其他一些例子中,我想检查数据库中是否存在某些东西。如何验证jinja2/pyramid/sqlalchemy中的独特表单元素?

我知道我需要查询我的数据库,但我不确定如何从模板本身或如果有另一种方式来做到这一点。

回答

3

而不是使用JavaScript或的jQuery ,你可以做一个消息系统,通过字典传递给渲染器。例如:

message = '' 
if 'form.submitted' in request.params:#form.submitted being the name of the submit of the form 
    #check if email exists 
    if exists: 
     message = 'email already registered' 
    else: 
     message = 'success' 
return dict(message = message) 

只是做它没有JS

+0

Thanks Wiz ...很高兴知道。我目前的做法是将电子邮件作为主键,然后捕获“除了IntegrityError:”错误,但我想也许有一种方法可以提前警告用户,因为超级烦人提交表单只是为了发现它失败。 – Lostsoul

+1

实际上,您可以保存窗体的所有值,并为渲染器提供所有窗体的代码,以便在获取响应时允许窗体中正确填充的部分自动填充。 – Wiz

+0

没有想到这一点,我会将它应用到我现有的代码中,但我仍然希望提供实时反馈(因为它适用于我的网站的许多其他区域)..但是,谢谢..我做到了想知道为什么我的表格一直空白,以及其他人如何保持价值。谢谢 – Lostsoul

4

您可以的Javascript做一个的XMLHttpRequesthttps://developer.mozilla.org/en/using_xmlhttprequest)到POST输入框的文本(如果你使用jQuery的,在即将到来的例子更容易),并做一个DB查询服务器端查看电子邮件(输入框文本)是否是唯一的。因此,您将返回此视图的响应,其中针对非IE浏览器的@view_config()修饰器中的xhr=True以及针对IE浏览器设置的request.response.content_type='text/html'。例如:

@view_config(permission='view', route_name='check_email', renderer='json') ##for IE browsers 
@view_config(permission='view', route_name='check_email', renderer='json', xhr=True) ##for non-IE 
def check_email(request): 
    email= request.POST['email'] 

    dbquery = DBSession.query(User).filter(User.email==email).first() 

    ## if the email exists in the DB 
    if dbquery: 
     msg = 'used' 
    ## else if the email is available 
    else: 
     msg = 'available' 

    if request.is_xhr: 
     return {'msg':msg} 
    else: # for IE browser 
     request.response.content_type = 'text/html' 
     return Response(json.dumps({'msg':msg})) 

您可以通过使用库(如jQuery)轻松地执行POST(客户端)来处理XMLHttpRequest。包括在你的模板jQuery库,还有的.js与你的文件脚本之后:

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js" type="text/javascript"></script> 
<script type='text/javascript' src="{{request.static_url('tutorial:static/myscript.js')}}"></script> 

然后在myscript.js做:

$(function() { 
    $('#email').on('blur', postEmail) 
}) 

// this function POSTs the entered email 
function postEmail() { 
    var email = $(this).val() 
    $.post('/check_email', email, callback) 
} 

// this function is used to do something with the response returned from your view 
function callback(data) { 
    if (data['msg'] === 'used') { 
    alert('used') 
    } 
    else if (data['msg'] === 'available') { 
    alert('available') 
    } 
} 
+0

非常感谢Raj..I完全理解你的Python代码,但我很新的Java脚本/ Jquery..and我把你的方式代码到我的表单(并创建您的myscript.js并添加jquery.js)..我没有得到任何错误,但我没有得到任何新东西。我是否将脚本标签封装到我的输入标签中?或者我如何将它整合到我的表单中? – Lostsoul

+0

嗯,你可以将你当前的代码粘贴到某种类型的pastebin中(例如http://paste.ofcode.org),这样我可以更好地理解你正在做什么? – Raj

+0

非常感谢您提供看看。我的金字塔代码是一种获取数据的简单形式。我创建了一个基于你的'check_username'代码的视图和路由,这里是我的jinja2代码:http://paste.ofcode.org/35cnVY7vMXABuVJM3nSVWa9 – Lostsoul