2012-04-11 17 views
1

Ich möchte alle meine Formulare mit HTML5 und dem Musterattribut validieren, aber wie immer ist nichts perfekt im Internet und ich brauche immer noch ein Backup, um die Benutzer zu fangen, die HTML5-freundliche Browser nicht verwenden.Imitiert man das Verhalten von HTML5-Musterattributen für Eingaben mit web2py?

Ich habe Probleme, genaue Darstellungen der regulären Ausdrücke im Handbuch zu finden, also wenn Sie wissen, würde ich etwas Hilfe schätzen. Ich habe den Code auf zwei Arten geschrieben, den HTML-Weg und den HTML-Hilfsweg (siehe unten) und der HTML5 funktioniert und validiert in modernen Browsern mit Ausnahme von IE wie erwartet, aber ich kann sie nicht in Python übersetzen.

Ein Beispiel, das Sie unten sehen werden, ist der Ausdruck pattern="[A-F0-9]{11}|[A-F0-9]{14}" Dies erzwingt effektiv eine Eingabe nur Großbuchstaben von A-F und Zahlen 0-9 enthalten. Es stellt auch sicher, dass die Länge genau 11 Zeichen oder 14 ist. Wie würde ich das in web2py verwenden? IS_LENGTH scheint nur einen Bereich aus meinen Tests zu akzeptieren und bisher habe ich nur IS_ALPHANUMERIC gefunden, um zu steuern, welche Zeichen akzeptiert werden.

Bitte beachten Sie das untenstehende Formular aus:

HTML:

<form id="activate_form" method="post" action=""> 
    <label for="meid">MSIE/ESN <sup>*</sup></label> 
    <input name="meid" pattern="[A-Fa-f0-9]{11}|[A-Fa-f0-9]{14}" placeholder="MEID/ESN" required /> 
    <br /> 
    <label for="zip">Zip Code <sup>*</sup></label> 
    <input type="number" name="zip" pattern="{5}" placeholder="Zip Code" required /> 
    <br /> 
    <br /> 
    <br /><br /> 
    <input type="button" name="cancel" value="Cancel" onClick="history.go(-1);return true;" /> 
    <input type="submit" name="submit" value="Activate" /> 
     <p class="small"><sup>*</sup> denotes a required field. 
</form> 

HTML-Helfer:

form=FORM(LABEL('MEID/ESN ',(SPAN('*'))),INPUT(_name='meid',_pattern="[A-F0-9]{11}|[A-F0-9]{14}",_placeholder='MEID/ESN',_required='required',_title="The MEID/ESN number only contains 11 or 13 characters, the letters A-F, and the numbers 0-9.",requires=[IS_LENGTH(11|14),IS_NOT_EMPTY()], _onblur="this.checkValidity();"),BR(),LABEL('ZIP CODE ',(SPAN('*'))),INPUT(_name='zip',_type='number',_pattern="[0-9]{5}",_placeholder='Zip Code',_required='required',_title="We only required the five character zip code.",requires=IS_NOT_EMPTY()),BR(),BR(),BR(),BR(),INPUT(_type='button',_name='cancel',_value='Cancel',_onclick="history.go(-1);return true;"),INPUT(_type='submit',_name='submit',_value='Activate'),_method='post',_id='activate_form') 
    if form.accepts(request,session): 
     response.flash = 'Form accepted' 
    # redirect(URL('next')) 
    elif form.errors: 
     response.flash = 'Form has errors' 
    return dict(form=form) 

Antwort

1

Wenn Sie mit clientseitige Validierung haften möchten, können Sie auch eine Javascript betrachten Polyfill-Bibliothek wie Webshims Lib, mit der Sie HTML5-Funktionen in älteren Browsern verwenden können. Beachten Sie auch, dass die clientseitige Validierung die Benutzerfreundlichkeit zwar verbessert, sie jedoch nicht vor böswilligen Angriffen schützt. Daher möchten Sie möglicherweise weiterhin eine serverseitige Überprüfung durchführen.

Wie auch immer, für die serverseitige Mustervalidierung können Sie den IS_MATCH() Validator verwenden. Zum Beispiel:

IS_MATCH('[A-F0-9]{11}|[A-F0-9]{14}', strict=True) 

, die aus dem Anfang der Zeichenfolge übereinstimmen, und Einstellung strict=True erfordert auch das Ende des String-Matching (entspricht das Hinzufügen eines „$“ an das Ende des regulären Ausdrucks). Wenn Sie den Anfang der Zeichenfolge nicht abgleichen, sondern stattdessen das Muster irgendwo in der Zeichenfolge suchen möchten, können Sie search=True festlegen.

1

Ich denke, Sie schauen nicht auf die entsprechenden Validatoren. Sie können IS_MATCH() in Ihnen Fall verwenden:

requires=IS_MATCH('^(\w{11}|\w{14})$') 

Werfen Sie einen Blick auf die Validierer Liste am book, gibt es andere, die von Interesse sein können. Auch wenn Sie mit speziellen Feldern arbeiten, die keiner der zur Verfügung gestellten Validatoren funktioniert, ist es sehr easy zu implementieren Sie besitzen =)

Der Quellcode von web2py ist sehr freundlich, ich empfehle Ihnen, einen Blick direkt auf den Code wenn Sie keine Antworten auf das Buch finden, was nicht immer aktuell ist. Möglicherweise haben sie das Buch jetzt aktualisiert, aber ich erinnere mich, dass ich vor einiger Zeit die Quellen für die Validatoren überprüft habe und es dort interessante Validatoren gab, die noch nicht dokumentiert waren. Ich habe gelesen, wie die FORM-Helfer implementiert werden, und es hat mir sehr geholfen, die "Magie" zu entmystifizieren und es mir möglich gemacht, einige sehr verrückte Sachen zu implementieren, die ich sonst neu erfinden würde, wie meine eigene Ajax-Spezialisierung Formulare, die mit dem CSRF-Schutz kompatibel sind.