-1

ユーザーが入力したフォームの一意の要素を検証する簡単な方法はありましたか?php(ユーザーがテーブルに入力した後のルックアップ値)でそれを行う方法を見つけましたが、jinja2を使用してそれを行う方法がわかりません

たとえば、ユーザーがサインアップしていて、すべてのメールアドレスが一意である必要がある場合、結果を送信する前に、一意でないことをユーザーに知らせるにはどうすればよいですか(例: https ://github.com/signup/freeあなたがあなたの電子メールを入力するならば、あなたが次の行に行くとすぐにそれが存在することをあなたに告げるならば、それはすでにメンバーです。私は多くのサイトがこれをするのを見ました)?今はエラーをキャッチできますが、ページが更新されてエラーが発生します。送信する前にフォームが失敗することを知らせたいと思います。この例では、存在しないものをチェックしていますが、他のいくつかの例では、データベースに何かが存在するかどうかをチェックしたいと思います。

データベースにクエリを実行する必要があることは理解していますが、テンプレート自体からクエリを実行する方法や、別の方法があるかどうかがわかりません。

4

2 に答える 2

4

Javascriptを使用してXMLHttpRequesthttps://developer.mozilla.org/en/using_xmlhttprequest)を実行して、入力ボックスのテキストをPOSTし(次の例のようにjQueryを使用するとさらに簡単になります)、サーバー側でDBクエリを実行できます。電子メール(入力ボックスのテキスト)が一意であるかどうかを確認します。したがって、このビューから応答が返されます。ここで、非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 に答える