Obrazci in validacija¶
Zakaj so obrazci tako pomembni¶
Obrazci so trenutek, ko spletna stran iz pasivne predstavitve postane interaktivna aplikacija. Prek obrazca uporabnik:
- vnese podatke,
- izbere možnosti,
- pošlje zahtevo strežniku,
- sproži spremembo stanja sistema.
Zato je obrazec eden najpomembnejših mostov med HTML, HTTP, Flaskom in bazo.
Osnovna zgradba obrazca¶
<form action="/dodaj" method="post">
<div>
<label for="naslov">Naslov</label>
<input id="naslov" name="naslov" type="text" required>
</div>
<div>
<label for="avtor">Avtor</label>
<input id="avtor" name="avtor" type="text" required>
</div>
<div>
<label for="leto">Leto izida</label>
<input id="leto" name="leto" type="number" min="0">
</div>
<button type="submit">Shrani</button>
</form>
Ta primer je majhen, a vsebuje skoraj vse bistvene ideje.
Ključni deli obrazca¶
form¶
Element form pove, da gre za skupino polj, ki se bodo oddala skupaj.
action¶
Pove, kam se podatki pošljejo.
method¶
Pove, kako se bodo podatki poslali. Pri tem predmetu sta ključni metodi:
getpost
name¶
To je ime polja, prek katerega ga bo strežnik prepoznal. Če name manjka, se vrednost običajno ne pošlje tako, kot pričakujemo.
label¶
label je izjemno pomemben. Ni samo vizualni napis. Pomaga pri:
- dostopnosti,
- boljšem kliku na polje,
- bolj razumljivem vnosu.
button¶
Gumb naj bo gumb. Za oddajo obrazca uporabi button type="submit".
Povezava med label in poljem¶
Zelo pomembna praksa:
Atribut for naj se ujema z id polja. To je ena najbolj uporabnih in hkrati najpogosteje zanemarjenih malenkosti.
Pogosti tipi polj¶
Besedilo¶
Število¶
E-pošta¶
Geslo¶
Večvrstično besedilo¶
Izbira ene možnosti¶
<select name="zanr">
<option value="roman">Roman</option>
<option value="poezija">Poezija</option>
</select>
Potrditev¶
<input id="strinjam" type="checkbox" name="strinjam">
<label for="strinjam">Strinjam se s pogoji</label>
GET in POST pri obrazcih¶
To je zelo pomembna razlika.
Kdaj uporabiti GET¶
- iskanje,
- filtriranje,
- navigacija po rezultatih,
- dejanja, ki ne spreminjajo podatkov.
Primer:
<form action="/iskanje" method="get">
<label for="q">Išči</label>
<input id="q" name="q" type="search">
<button type="submit">Išči</button>
</form>
Pri GET se parametri običajno vidijo v URL-ju.
Kdaj uporabiti POST¶
- dodajanje podatkov,
- urejanje,
- prijava,
- pošiljanje sporočil,
- dejanja, ki spreminjajo stanje.
To ni samo stvar stila. Gre za razumevanje pomena zahteve.
Klientska validacija¶
HTML ponuja osnovno pomoč pri preverjanju podatkov:
requiredminmaxminlengthmaxlengthtype="email"pattern
Primer:
<input
id="uporabnisko_ime"
name="uporabnisko_ime"
type="text"
required
minlength="3"
maxlength="20">
To je koristno, ker uporabnik hitreje dobi povratno informacijo.
Strežniška validacija¶
Tu je treba biti zelo direkten: klientska validacija ni dovolj.
Strežnik mora podatke preveriti znova, ker:
- uporabnik lahko pošlje zahtevo mimo obrazca,
- polja se lahko izklopijo ali spremenijo,
- podatki so lahko nepopolni ali zlonamerni.
Minimalna strežniška validacija pomeni vsaj:
- ali polje obstaja,
- ali je prazno,
- ali je tip smiselno pravilen,
- ali je vrednost v dovoljenem območju.
Povratna informacija uporabniku¶
Slab obrazec je tak, ki ob napaki samo “tiho ne dela”. Uporabnik mora razumeti:
- katero polje je problem,
- zakaj je problem,
- kaj mora popraviti.
Primer sporočila:
Dobre prakse za uporabnost¶
- polja naj bodo jasno poimenovana,
- ne zahtevaj nepotrebnih podatkov,
- združi sorodna polja,
- označi obvezna polja,
- gumb naj ima jasen napis,
- po uspehu uporabnika ne pusti v negotovosti.
Dobre prakse za dostopnost¶
- vsak vhod naj ima
label, - ne zanašaj se samo na placeholder,
- napake naj bodo razumljive tudi brez barve,
- logični vrstni red polj naj sledi normalni rabi,
- izogibaj se nepotrebni kompleksnosti.
Po oddaji obrazca¶
Zelo koristna praksa je, da po uspešni oddaji uporabnika preusmeriš drugam. To prepreči ponovno oddajo ob osvežitvi strani.
Ta vzorec je znan kot:
Ni nujno, da ga poimenuješ z angleško kratico, je pa dobro, da pokažeš logiko.
Pogoste napake¶
Manjka name¶
Potem Flask pogosto ne dobi podatkov, čeprav dijak misli, da jih bo.
label ni povezan s poljem¶
To zmanjšuje kakovost obrazca in dostopnost.
Vse se dela z GET¶
To je klasična začetniška napaka.
Samo HTML preverjanje¶
Če strežnik ničesar ne preveri, je rešitev krhka.
Gumb nima jasnega pomena¶
Pošlji, Shrani, Dodaj knjigo niso povsem ista sporočila. Jasnost pomaga.
Kontrolni seznam¶
1. Ali ima vsako polje name?
2. Ali ima vsako polje ustrezen label?
3. Ali sem pravilno izbral GET ali POST?
4. Ali ima obrazec smiseln action?
5. Ali so obvezna polja jasno označena?
6. Ali strežnik podatke preveri še enkrat?
7. Ali uporabnik vidi razumljivo napako?
Kaj naj dijak zna po tem poglavju¶
- sestaviti osnovni obrazec,
- povezati
labelininput, - izbrati med
GETinPOST, - uporabiti osnovno HTML validacijo,
- razumeti, zakaj je strežniška validacija nujna,
- pripraviti obrazec, ki je uporabniku dovolj prijazen.
Najbolj pomembno sporočilo
Obrazec ni samo skupek polj. Je dogovor med uporabnikom, brskalnikom, strežnikom in aplikacijo. Če dijak to razume, bo kasnejši backend precej manj skrivnosten.