2012-07-03 49 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