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>