djangoform詳解
阿新 • • 發佈:2018-03-17
ttr http strong isa 數據 密碼 窗口 AD include
orm表單的功能
- 準備數據、重構數據,以便下一步提交。
- 為數據創建HTML 表單
- 接收並處理客戶端提交的表單和數據
普通字段詳解:
布爾值 checkbox charFied input() ChoiceField (select標簽) DateField Dateinput 標簽 emailField EaillInput FileField ImageField MultipleChoiceField (select標簽 multiple)處理關系的字段:
兩個字段可用於表示模型之間的關系:ModelChoiceField和ModelMultipleChoiceField 。這兩個字段都需要單個queryset參數,用於創建字段的選擇。
表單裏choice用的數據庫裏數據時不會實時更新。所以需要將choice放到init裏,每次使用都執行一遍:
示例字段的核心參數:
required
f = forms.CharField(required=False)
默認為True。
label
>>> from django import forms >>> class CommentForm(forms.Form): ... name = forms.CharField(label=‘Your name‘) ... url = forms.URLField(label=‘Your Web site‘, required=False) ... comment = forms.CharField() >>> f = CommentForm(auto_id=False) >>> print(f) <tr><th>Your name:</th><td><input type="text" name="name" /></td></tr> <tr><th>Your Web site:</th><td><input type="url" name="url" /></td></tr> <tr><th>Comment:</th><td><input type="text" name="comment" /></td></tr>
error_messages:
error_messages 參數讓你覆蓋字段引發的異常中的默認信息。傳遞的是一個字典,其鍵為你想覆蓋的錯誤信息
has_changed():方法用於決定字段的值是否從初始值發生了改變。返回True 或False
字段數據:
不管表單提交的是什麽數據,一旦通過調用is_valid() 成功驗證(is_valid() 返回True),驗證後的表單數據將位於form.cleaned_data 字典中。
from django.core.mail import send_mail if form.is_valid(): subject = form.cleaned_data[‘subject‘] message = form.cleaned_data[‘message‘] sender = form.cleaned_data[‘sender‘] cc_myself = form.cleaned_data[‘cc_myself‘] recipients = [‘[email protected]‘] if cc_myself: recipients.append(sender) send_mail(subject, message, sender, recipients) return HttpResponseRedirect(‘/thanks/‘)
重寫驗證方法:
# 自定義方法(局部鉤子),密碼必須包含字母和數字 def clean_password(self): if self.cleaned_data.get(‘password‘).isdigit() or self.cleaned_data.get(‘password‘).isalpha(): raise ValidationError(‘密碼必須包含數字和字母‘) else: return self.cleaned_data[‘password‘] def clean_valid_code(self): # 檢驗驗證碼正確;之前生成的驗證碼保存在了了session中 if self.cleaned_data.get(‘valid_code‘).upper() == self.request.session.get(‘valid_code‘): return self.cleaned_data[‘valid_code‘] else: raise ValidationError(‘驗證碼不正確‘) # 自定義方法(全局鉤子, 檢驗兩個字段),檢驗兩次密碼一致; def clean(self): if self.cleaned_data.get(‘password‘) != self.cleaned_data.get(‘password2‘): raise ValidationError(‘密碼不一致‘) else: return self.cleaned_data # 註意,上面的字典取值用get, 因為假如在clean_password中判斷失敗,那麽沒有返回值,最下面的clean方法直接取值就會失敗s
使用表單模:
- {{ form.as_table }} 以表格的形式將它們渲染在<tr> 標簽中
- {{ form.as_p }} 將它們渲染在<p> 標簽中
- {{ form.as_ul }} 將它們渲染在<li> 標簽中
手工渲染字段:{{ form.name_of_field }
{{ form.non_field_errors }} <div class="fieldWrapper"> {{ form.subject.errors }} <label for="{{ form.subject.id_for_label }}">Email subject:</label> {{ form.subject }} </div> <div class="fieldWrapper"> {{ form.message.errors }} <label for="{{ form.message.id_for_label }}">Your message:</label> {{ form.message }} </div> <div class="fieldWrapper"> {{ form.sender.errors }} <label for="{{ form.sender.id_for_label }}">Your email address:</label> {{ form.sender }} </div> <div class="fieldWrapper"> {{ form.cc_myself.errors }} <label for="{{ form.cc_myself.id_for_label }}">CC yourself?</label> {{ form.cc_myself }} </div>
渲染表單的錯誤信息:{{ form.name_of_field.errors }}
叠代表單的字段:{{ field }} 包含所有有用的屬性
{% for field in form %} <div class="fieldWrapper"> {{ field.errors }} {{ field.label_tag }} {{ field }} </div> {% endfor %}
可重用的表單模板:
在表單保存到單獨的模塊,用includ標簽來重用
{% include "form_snippet.html" %} # In form_snippet.html: {% for field in form %} <div class="fieldWrapper"> {{ field.errors }} {{ field.label_tag }} {{ field }} </div> {% endfor %}
widgets窗口小部件
widgets.attr 設置標簽屬性
class CommentForm(forms.Form): name = forms.CharField(widget=forms.TextInput(attrs={‘class‘: ‘special‘})) url = forms.URLField() comment = forms.CharField(widget=forms.TextInput(attrs={‘size‘: ‘40‘})) >>> f = CommentForm(auto_id=False) >>> f.as_table() <tr><th>Name:</th><td><input type="text" name="name" class="special"/></td></tr> <tr><th>Url:</th><td><input type="url" name="url"/></td></tr> <tr><th>Comment:</th><td><input type="text" name="comment" size="40"/></td></tr
生成form field對象,指定類型
from django.form impor widgets,fields xxxx = fields.CharField(widget=widgets.Textarea)
djangoform詳解