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>