Django

Forms-Forms

Django, formuláře

Formuláře - úroveň formuláře, atributy

as_p, as_table, as_ul
Způsob automatického renderování polí v šabloně. Pole jsou řazeny v pořadí, v jakém jsou v definici formuláře.
is_valid
spustí validaci a vrátí True/False
non_field_errors
chyby netýkající se polí, hodí se v šabloně
errors
slovník, (form.errors['field'] -> chybová hláška)
cleaned_data
slovník s normalizovanými daty z vyplněného formuláře. Např. datum můžeme zadat jako 1.3.2014, ale po normalizaci z něj bude datatime.date(2013,3,1). Char a Email převede na Unicode. Obsahuje jen úspěšně validované položky. (invalids jsou v errors) a jen položy, které jsou v definici formuláře (žádné naše extra). Tento slovník se u ne-validovaného formuláře vůbec nenachází.
clean
is_bound
formulář je bound (s daty), nebo unbond (prázdný)
is_multipart
?obsahuje soubory?
media .absoulte_path .add_css .add_js .render...
error_css_class, required_css_class
V definici formuláře umožní pojmenovat css classes pro formátování povinných polí a chybových zpráv.
has_changed, changed_data
initial
výchozí hodnota polí pro unbound formuláře, zadává se jako slovník
fields, hidden_fields, visible_fields
files
auto_id
(True, False, řetězec s %s) jestli se mají generovat labels automatické identifikátory pro labels ve formuláři
label_suffix
Co se doplní za label (default ":")

Formulářová data jsou validována v okamžiku volíní is_valid(), nebo errors. Tj. není nutné volat is_valid, abych si mohl prohlédnout errors.

Data do formuláře se vloží ze slovníku:

 data = {'jmeno': 'Franta', 'primeni': 'Novak')
 form = NejakyForm(data)

 # data, která přišla z formuláře metodou post můžeme vložit:
 form = NejakyForm(request.POST)

Formulář můžeme vytvořit pomocí metod as_p, as_table, as_ul.

K jednotilivým polím me přístup form['název_pole'] - vrátí html input tag. Chybové hlášky jsou pod form['název_pole'].errors,... Příklady:

 >>> print(f['message'])
 <input type="text" name="message" />

 >>> f['message'].errors
 [u'This field is required.']
 >>> print(f['message'].errors)
 <ul class="errorlist"><li>This field is required.</li></ul>

 >>> print(f['message'].label_tag())
 <label for="id_message">Message</label>

 >>> f['message'].css_classes()
 'required'

 >>> f['message'].css_classes('foo bar')
 'foo bar required'

 >>> data = {'subject': 'hi', 'message': , 'sender': , 'cc_myself': ''}
 >>> initial = {'subject': 'welcome'}
 >>> unbound_form = ContactForm(initial=initial)
 >>> bound_form = ContactForm(data, initial=initial)
 >>> print(unbound_form['subject'].value())
 welcome
 >>> print(bound_form['subject'].value())
 hi

Formuláře lze dědit, a to i vícenásobně. Potomek může přidat svoje pole.

Jeden form může mít pole z více forms. Pak je možné jim přidělit prefix pro vlastní jmenný prostor:

 >>> mother = PersonForm(prefix="mother")
 >>> father = PersonForm(prefix="father")
 >>> print(mother.as_ul())
 <li><label for="id_mother-first_name">First name:</label> 
    <input type="text" name="mother-first_name" id="id_mother-first_name" /></li>
 <li><label for="id_mother-last_name">Last name:</label> 
    <input type="text" name="mother-last_name" id="id_mother-last_name" /></li>
 >>> print(father.as_ul())
 <li><label for="id_father-first_name">First name:</label> 
    <input type="text" name="father-first_name" id="id_father-first_name" /></li>
 <li><label for="id_father-last_name">Last name:</label> 
    <input type="text" name="father-last_name" id="id_father-last_name" /></li>