Django---form 詳解

Form表單的功能html

  • 準備數據、重構數據,以便下一步提交。
  • 爲數據建立HTML 表單
  • 接收並處理客戶端提交的表單和數據

普通字段詳解:git

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)

處理關係的字段:正則表達式

兩個字段可用於表示模型之間的關係:ModelChoiceFieldModelMultipleChoiceField這兩個字段都須要單個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裏,每次使用都執行一遍:django

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 = ...
示例

字段的核心參數:session

requiredapp

   f = forms.CharField(required=False)
  默認爲True。ide

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:ui

error_messages 參數讓你覆蓋字段引起的異常中的默認信息。傳遞的是一個字典,其鍵爲你想覆蓋的錯誤信息url

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 = ['info@example.com']
    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)
相關文章
相關標籤/搜索