Django---form 詳解
阿新 • • 發佈:2017-10-26
opened ade multiple ssi 密碼 ech 將在 文件名 重新安裝
Form表單的功能
- 準備數據、重構數據,以便下一步提交。
- 為數據創建HTML 表單
- 接收並處理客戶端提交的表單和數據
普通字段詳解:
class BooleanField(**kwargs):
默認的Widget:CheckboxInput
空值:False
規範化為:Python 的True 或 False。
如果字段帶有required=True,驗證值是否為True(例如復選框被勾上)。
錯誤信息的鍵:required
布爾值 checkbox
class CharField(**kwargs): 默認的Widget:TextInput 空值:‘‘(一個空字符串) 規範化為:一個Unicode 對象。 如果提供,驗證max_length 或min_length。 否則,所有的輸入都是合法的。 錯誤信息的鍵:required, max_length, min_length 有兩個參數用於驗證: max_length min_length 如果提供,這兩個參數將確保字符串的最大和最小長度。charFied input()
class ChoiceField(**kwargs)? 默認的Widget:Select 空值:‘‘(一個空字符串) 規範化為:一個Unicode 對象。 驗證給定的值在選項列表中存在。 錯誤信息的鍵:required, invalid_choice invalid_choice 錯誤消息可能包含%(value)s,它將被選擇的選項替換掉。 接收一個額外的必選參數:choices 用來作為該字段選項的一個二元組組成的可叠代對象(例如,列表或元組)或者一個可調用對象。 例如: YEAR_IN_SCHOOL_CHOICES = ( (‘FR‘, ‘Freshman‘), (‘SO‘, ‘Sophomore‘), (‘JR‘, ‘Junior‘), (‘SR‘, ‘Senior‘), )ChoiceField (select標簽)
class DateField(**kwargs):
默認的Widget:DateInput
空值:None
規範化為:一個Python datetime.date 對象。
驗證給出的值是一個datetime.date、datetime.datetime 或指定日期格式的字符串。
錯誤信息的鍵:required, invalid
接收一個可選的參數:
input_formats
一個格式的列表,用於轉換一個字符串為datetime.date 對象。
DateField Dateinput 標簽
class EmailField(**kwargs) 默認的Widget:EmailInput 空值:‘‘(一個空字符串) 規範化為:一個Unicode 對象。 驗證給出的值是一個合法的郵件地址,使用一個適度復雜的正則表達式。 錯誤信息的鍵:required, invalid 具有兩個可選的參數用於驗證,max_length 和min_length。如果提供,這兩個參數確保字符串的最大和最小長度。emailField EaillInput
class FileField(**kwargs)?
默認的Widget:ClearableFileInput
空值:None
規範化為:一個UploadedFile 對象,它封裝文件內容和文件名為一個單獨的對象。
可以驗證非空的文件數據已經綁定到表單。
錯誤信息的鍵:required, invalid, missing, empty, max_length
具有兩個可選的參數用於驗證,max_length 和 allow_empty_file。如果提供,這兩個參數確保文件名的最大長度,而且即使文件內容為空時驗證也會成功。
FileField
class ImageField(**kwargs)?
默認的Widget:ClearableFileInput
空值:None
規範化為: An UploadedFile object that wraps the file content and file name into a single object.
驗證文件數據已綁定到表單,並且該文件具有Pillow理解的圖像格式。
錯誤信息的鍵:required, invalid, missing, empty, invalid_image
使用ImageField需要安裝Pillow並支持您使用的圖像格式。如果在上傳圖片時遇到損壞 圖像錯誤,通常意味著Pillow不了解其格式。要解決這個問題,請安裝相應的庫並重新安裝Pillow。
ImageField
class MultipleChoiceField(**kwargs)?
默認的Widget:SelectMultiple
空值:[](一個空列表)
規範化為:一個Unicode 對象列表。
驗證給定值列表中的每個值都存在於選擇列表中。
錯誤信息的鍵:required, invalid_choice, invalid_list
invalid_choice錯誤消息可能包含%(value)s,將替換為所選擇的選項。
對於ChoiceField,需要一個額外的必需參數choices。
MultipleChoiceField (select標簽 multiple)
處理關系的字段:
兩個字段可用於表示模型之間的關系:ModelChoiceField和ModelMultipleChoiceField。這兩個字段都需要單個queryset參數,用於創建字段的選擇。
class ModelChoiceField(**kwargs)? 默認的Widget:Select 空值:None 規範化為:一個模型實例。 驗證給定的id存在於查詢集中。 錯誤信息的鍵:required, invalid_choice 可以選擇一個單獨的模型對像,適用於表示一個外鍵字段。 ModelChoiceField默認widet不適用選擇數量很大的情況,在大於100項時應該避免使用它。 需要單個參數: queryset 將導出字段選擇的模型對象的QuerySet,將用於驗證用戶的選擇。 ModelChoiceField也有兩個可選參數: empty_label 默認情況下,ModelChoiceField使用的<select>小部件將在列表頂部有一個空選項。您可以使用empty_label屬性更改此標簽的文本(默認為"---------"),也可以禁用空白標簽完全通過將empty_label設置為None: to_field_name 此可選參數用於指定要用作字段窗口小部件中選項的值的字段。確保它是模型的唯一字段,否則選定的值可以匹配多個對象。默認情況下,它設置為None,在這種情況下,將使用每個對象的主鍵。 例如: field1 = forms.ModelChoiceField(queryset=...) <select id="id_field1" name="field1"> <option value="obj1.pk">Object1</option> <option value="obj2.pk">Object2</option> ... </select>ModelChoiceField
class ModelMultipleChoiceField(**kwargs)
默認的Widget:SelectMultiple
空值:QuerySet (self.queryset.none())
規範化為: 模型實例的一個QuerySet。
驗證在給定的值列表中的每個id存在於查詢集中。
錯誤信息的鍵:required, list, invalid_choice, invalid_pk_value
invalid_choice消息可以包含%(value)s並且invalid_pk_value消息可以包含%(pk)s其將被適當的值代替。
允許選擇適合於表示多對多關系的一個或多個模型對象。與ModelChoiceField一樣,您可以使用label_from_instance自定義對象表示,queryset是必需的參數:
queryset
將導出字段選擇的模型對象的QuerySet,將用於驗證用戶的選擇。
ModelMultipleChoiceField
表單裏choice用的數據庫裏數據時不會實時更新。所以需要將choice放到init裏,每次使用都執行一遍:
class FooMultipleChoiceForm(forms.Form):
foo_select = forms.ModelMultipleChoiceField(queryset=None)
def __init__(self, *args, **kwargs):
super(FooMultipleChoiceForm, self).__init__(*args, **kwargs)
self.fields[‘foo_select‘].queryset = ...
示例
字段的核心參數:
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)
Django---form 詳解