2012-07-03 3 views
0

사용자가 입력 한 양식에서 고유 한 요소의 유효성을 검사하는 쉬운 방법이 있습니까? 사용자가 테이블에 입력 한 후 검색 값을 PHP에서 수행하는 방법을 찾았지만 jinja2를 사용하여 수행하는 방법을 모르겠다.jinja2/pyramid/sqlalchemy에서 고유 한 양식 요소의 유효성을 검사하려면 어떻게해야합니까?

예를 들어, 사용자가 가입 중이며 모든 이메일 주소가 고유해야합니다. 어떻게하면 결과를 제출하기 전에 고유하지 않은지 알려줄 수 있습니까 (예 : https://github.com/signup/free). 회원님이 이미 이메일을 입력하면 다음 줄로 가면 즉시 알려 드리겠습니다. 많은 사이트에서이 작업을 수행함)? 지금은 오류를 잡을 수 있지만 페이지를 새로 고치고 오류가 발생하며 제출하기 전에 양식이 실패 할 것임을 알리고 싶습니다. 이 예제에서는 존재하지 않는 것을 검사하지만 다른 예제에서는 데이터베이스에있는 것이 있는지 확인하려고합니다.

데이터베이스를 쿼리해야하지만 템플릿 자체에서 수행하는 방법이나 다른 방법이 있는지 확실하지 않습니다.

답변

3

를 사용하는 대신 자바 스크립트 또는 jQuery를의 , 당신은 dict를 통해 렌더러로 메시지 시스템을 전달할 수 있습니다. 예를 들어 Raj..I이 완전히 파이썬 코드를 이해하지만 난 넣어 자바 스크립트/Jquery..and에 아주 새로운 해요 작정 JS없이

+0

감사합니다. 좋은 ... 알고 있습니다. 내 현재 접근 방식은 이메일을 기본 키로 설정 한 다음 'IntegrityError 제외 :'오류를 잡는 것입니다.하지만 사용자에게 미리 경고하는 방법이 있을지도 모릅니다. – Lostsoul

+1

실제로 양식의 모든 값을 저장하고 렌더러에 모든 것을 담은 표제를 제공하여 양식에 정확하게 채워진 부분을 응답 할 때 자동으로 채울 수 있습니다. – Wiz

+0

그 생각을하지 않았지만, 기존의 코드에 적용 할 것이지만 여전히 실시간 피드백을주고 싶다. (내 사이트의 다른 많은 영역에도 적용될 수 있기 때문에). 내 양식이 공백으로 돌아가는 이유와 다른 사람들이 어떻게 가치를 지키는 지 궁금해하십니다. 감사 – Lostsoul

4

당신은 POST자바 스크립트와 (당신은 곧 예에서와 같이 jQuery를를 사용하는 경우 더 쉽게) 입력 상자의 텍스트를 XMLHttpRequest의 (https://developer.mozilla.org/en/using_xmlhttprequest)를 수행하고, 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})) 

당신은 XMLHttpRequest를 돌봐 jQuery와 같은 라이브러리를 사용하여 쉽게 (클라이언트 측)를 POST 할 수 있습니다. 의 .js 당신과 함께 스크립트 파일뿐만 아니라, 템플릿에서 jQuery 라이브러리를 포함한 후 : myscript.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> 

그리고 작업을 수행합니다

$(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

덕분에 그 일의

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) 

그냥하는 방법 당신의 코드를 내 양식에 추가하고 (myscript.js를 만들고 jquery.js를 추가했습니다.) 오류가 발생하지 않지만 새로운 것은 없습니다. 양식의 'input' 태그에 스크립트 태그를 래핑합니까? 또는 어떻게 그것을 내 양식에 통합합니까? – Lostsoul

+0

흠, 현재 코드를 일종의 pastebin (예 : http://paste.ofcode.org)에 붙여 넣을 수 있습니까? – Raj

+0

제공 해주셔서 대단히 감사드립니다. 내 피라미드 코드는 데이터를 취하는 간단한 형식입니다. 'check_username' 코드를 기반으로보기와 경로를 만들었고 여기에 제 jinja2 코드가 있습니다 : http://paste.ofcode.org/35cnVY7vMXABuVJM3nSVWa9 – Lostsoul

관련 문제