是否有一种简单的方法来验证用户输入表单中的唯一元素?我找到了在php中进行此操作的方法(用户在表中输入后查找值)但不确定如何使用jinja2
例如,假设用户正在注册,并且我要求所有电子邮件地址都是唯一的,如何在提交结果之前让他们知道它不是唯一的(如下所示:https://github.com/signup/free如果您已经是会员如果你输入你的电子邮件,它会告诉你它一旦你到下一行就存在。我见过很多网站这样做了吗?现在我可以捕获错误,但它刷新页面并给他们一个错误,我想让他们知道他们的表单在提交前会失败。在这个例子中,我正在检查一些不存在的东西,但在其他一些例子中,我想检查数据库中是否存在某些东西。
我理解我需要查询我的数据库,但我不确定如何从模板本身或者是否有其他方法来执行此操作。
答案 0 :(得分:4)
您可以使用 Javascript 执行 XMLHttpRequest (https://developer.mozilla.org/en/using_xmlhttprequest)发布输入框的文本(甚至如果您使用 jQuery (如下一个示例中)更容易,并执行数据库查询服务器端以查看电子邮件(输入框文本)是否唯一。因此,您将从此视图返回响应,其中{IE}浏览器中的xhr=True
装饰器中的@view_config()
和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')
}
}
答案 1 :(得分:3)
您可以执行消息系统,通过dict将其传递给渲染器,而不是使用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
的方式