-1

是否有一种简单的方法来验证用户输入表单中的独特元素?我找到了在 php 中执行此操作的方法(用户在表中输入后查找值)但不确定如何使用 jinja2

例如,假设一个用户正在注册,我要求所有电子邮件地址都是唯一的,我怎么能让他们在提交结果之前知道它不是唯一的(如果你是这样: https ://github.com/signup/free已经是会员,如果您输入您的电子邮件,它会在您转到下一行时立即告诉您它存在。我见过很多网站都这样做)?现在我可以捕捉到错误,但它会刷新页面并给他们一个错误,我想让他们知道他们的表单在提交之前会失败。在此示例中,我正在检查不存在的内容,但在其他一些示例中,我想检查数据库中是否存在某些内容。

我知道我需要查询我的数据库,但我不确定如何从模板本身执行此操作,或者是否有其他方法可以执行此操作。

4

2 回答 2

4

您可以使用Javascript执行XMLHttpRequest ( https://developer.mozilla.org/en/using_xmlhttprequest )以POST输入框的文本(如果您使用jQuery 则更容易,如即将到来的示例所示)并执行数据库查询服务器端查看电子邮件(输入框文本)是否唯一。因此,您将从此视图返回响应,其中在非 IE 浏览器的装饰器中为 IE 浏览器设置。例如:xhr=True@view_config()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 之类的库来处理 XMLHttpRequest 轻松地(客户端)进行 POST。在您的模板中包含 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')
  }
}
于 2012-07-03T22:59:43.597 回答
3

您可以创建一个消息系统,而不是使用 javascript 或 Jquery,通过 dict 将其传递给渲染器。例如:

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 的方法

于 2012-07-04T16:50:19.390 回答