1. 程式人生 > >Django---form 詳解

Django---form 詳解

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)

處理關系的字段:

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

技術分享
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():方法用於決定字段的值是否從初始值發生了改變。返回TrueFalse

字段數據:

不管表單提交的是什麽數據,一旦通過調用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 詳解