Django Form表單驗證和字段驗證


摘要

對用戶提交的數據的過濾、驗證、避免非法數據提交、對用戶輸入的數據格式的提示。這些都是我們在頁面中必須實現的一個功能。例如我們可以使用自己寫正則表達式來驗證,這是一種比較常常想到的方法,例如網上大神們收集的一些常見正則表達式集合 :原文猛戳

Django-Form


前提

但是在Django中,我們擁有最簡單實用快速的方式來實現這個功能.
我們以一個簡單的注冊頁面來開始:

# urls.py
url(r'^register/', views.Register.as_view(),name='register'),
# views.py
class Register(View):
    def get(self, request):
        return render(request, 'register.html',)

    def post(self, request):
        return HttpResponse("OK")
# register.html
<form action="{% url 'register' %}" method="post">
    {% csrf_token %}
        <p><input type="text" name="user"></p>
        <p><input type="text" name="password"></p>
        <p><input type="text" name="email"></p>
        <p><input type="submit" name="提交"></p>
</form>

在這樣的前提下,我們需要對用戶輸入的數據做一個限制,需要做哪些限制呢,我們大概簡單舉個例子:

  • 用戶名:長度大於6小於24,不能有特殊字符,只允許數字字母下划線,不能為空
  • 密碼:長度大於6小於32,不能為空
  • 郵箱:滿足郵箱格式,不能為空

實現上面的需求

# views.py

class FormVerify(forms.Form):
    username = fields.CharField(max_length=24,
                                min_length=6,
                                error_messages={
                                    "required": "用戶名不能為空",
                                    'min_length': "長度小於6",
                                    'max_length': "長度大於32",
                                })
    email = fields.EmailField(
        error_messages={
            'required': "郵箱不能為空",
            "invalid": "郵箱格式錯誤",
        }
    )
    password = fields.CharField(
        max_length=32,
        min_length=6,
        error_messages={
            'required': "密碼不能為空",
            'min_length': "密碼長度不能小於6",
            'max_length': "密碼長度不能大於32"
        },
        widget=widgets.PasswordInput()
    )




class Register(View):
    def get(self, request):
        return render(request, 'register.html',)

    def post(self, request):
        return HttpResponse("OK")

步驟說明:

  1. 定制一個類,需要繼承forms.Form
  2. 類中的字段名必須和form中提交的數據的name一致,使用fields中各種類型的字段
  3. 然后對這個字段指定自己想要的各種約束條件

Django中內置字段整理

官方文檔

基類Field
required                     是否可以為空
label                        等同於html中label,input框前面顯示的內容
label_suffix                 lable顯示內容與input之間的分隔符,例如冒號:
initial                      初始值
widget                       自定制生成html的標簽
help_text                    input框顯示的提示內容
error_messages               定制各種錯誤信息
validators=[]                自定制匹配規則
localize                     本地化,一般會在時間上使用
disabled                     可以將input設置成不可編輯狀態
has_changed()                監測字段內容是否改變
show_hidden_initial=False,   是否在當前插件后面再加一個隱藏的且具有默認值的插件(可用於檢驗兩次輸入是否一直)
CharField(Field)

文本類型

Default widget: TextInput
max_length
min_length
strip=True    去掉輸入中的空格
empty_value    空值的默認值
IntegerField(Field)

整數類型

max_value
min_value
FloatField(IntegerField)

浮點數類型

Default widget: NumberInput
Error message keys: required, invalid, max_value, min_value
DecimalField(IntegerField)

小數類型

Default widget: NumberInput when Field.localize is False, else TextInput.
Error message keys: required, invalid, max_value, min_value, max_digits, max_decimal_places, max_whole_digits

max_value  最大值
min_value  最小值
max_digits  總長度
decimal_places  小數長度
ChoiceField(Field)

單選類型

Default widget: Select
Error message keys: required, invalid_choice
MultipleChoiceField(ChoiceField)

多選類型

Default widget: SelectMultiple
Error message keys: required, invalid_choice, invalid_list
TypedMultipleChoiceField(MultipleChoiceField)

MultipleChoiceField,但是接受額外的參數coerceempty_value

Default widget: SelectMultiple
Error message keys: required, invalid_choice

GenericIPAddressField(CharField)

IP地址

Default widget: TextInput
Error message keys: required, invalid
protocol   支持的IP地址類型: both (default), IPv4 or IPv6
unpack_ipv4   解析為ipv4地址,可以將::ffff:192.0.2.1解析為192.0.2.1
TypedChoiceField(ChoiceField)

ChoiceField,但是接受額外的參數coerceempty_value

Default widget: Select
Error message keys: required, invalid_choice
coerce         接收一個參數並返回強制轉換后的值的一個函數
empty_value    空值的默認值
TimeField(BaseTemporalField)

時間格式類型,datetime.time 對象

Default widget: TextInput
Error message keys: required, invalid
input_formats  如果未指定,默認類型:
         '%H:%M:%S',     # '14:30:59'
         '%H:%M',        # '14:30'
DateField(BaseTemporalField)

日期格式類型datetime.date 對象

Default widget: DateInput
Error message keys: required, invalid
input_formats: 默認格式(default):
        ['%Y-%m-%d',      # '2006-10-25'
         '%m/%d/%Y',      # '10/25/2006'
         '%m/%d/%y']      # '10/25/06'
但是在seettings中設置 USE_L10N=False,以下的格式也將包含在默認的輸入格式中
         ['%b %d %Y',      # 'Oct 25 2006'
          '%b %d, %Y',     # 'Oct 25, 2006'
          '%d %b %Y',      # '25 Oct 2006'
          '%d %b, %Y',     # '25 Oct, 2006'
          '%B %d %Y',      # 'October 25 2006'
          '%B %d, %Y',     # 'October 25, 2006'
          '%d %B %Y',      # '25 October 2006'
          '%d %B, %Y']     # '25 October, 2006'
DateTimeField(BaseTemporalField)

時間日期格式類型, datetime.datetime對象

Default widget: DateTimeInput
Error message keys: required, invalid
input_formats   默認格式:
          ['%Y-%m-%d %H:%M:%S',    # '2006-10-25 14:30:59'
           '%Y-%m-%d %H:%M',       # '2006-10-25 14:30'
           '%Y-%m-%d',             # '2006-10-25'
           '%m/%d/%Y %H:%M:%S',    # '10/25/2006 14:30:59'
           '%m/%d/%Y %H:%M',       # '10/25/2006 14:30'
           '%m/%d/%Y',             # '10/25/2006'
           '%m/%d/%y %H:%M:%S',    # '10/25/06 14:30:59'
           '%m/%d/%y %H:%M',       # '10/25/06 14:30'
           '%m/%d/%y']             # '10/25/06'

  • 將在1.7版本起啟用,改用SplitDateTimeWidget
EmailField(CharField)

郵件類型

Default widget: EmailInput
Error message keys: required, invalid
URLField(CharField)

URL類型

Default widget: URLInput
Error message keys: required, invalid
max_length
min_length
SlugField(CharField)

數字,字母,下划線,減號

Default widget: TextInput
Error messages: required, invalid
allow_unicode 
FileField(Field)

文件,一個UploadedFile對象,可以在后端拿到這個對象后使用chunks 方法來保存文件

Default widget: ClearableFileInput
Error message keys: required, invalid, missing, empty, max_length
max_length 文件最大長度
allow_empty_file 是否允許文件為空
FilePathField(ChoiceField)

文件路徑,Unicode對象

Default widget: Select
Error message keys: required, invalid_choice
path 路徑
recursive          Default is False 是否遞歸
match              自定義正則匹配,匹配這個表達式的名稱才允許作為選項
allow_files        Default is True   是否包含文件
allow_folders      Default is False  是否包含文件夾
ImageField(FileField)

使用ImageField需要安裝Pillow並支持使用的圖像格式,UploadedFile對象將有一個額外的image屬性,包含Pillow 圖像實例,用於檢查文件是一個有效的圖像且:
form表單中:enctype="multipart/form-data
views函數中:obj = MyForm(request.POST, request.FILES)

Default widget: ClearableFileInput
Error message keys: required, invalid, missing, empty, invalid_image

RegexField(CharField)
Default widget: TextInput
Error message keys: required, invalid
regex      自定義正則
strip      Defaults to False 去除空格
  • 自1.8版起已棄用,會在Django 2.0中刪除
UUIDField(CharField)

匹配uuid類型

Default widget: TextInput
Error message keys: required, invalid

ComboField(Field)

使用多個驗證方式同時驗證

Default widget: TextInput
Error message keys: required, invalid
fields=[]
        fields=[CharField(max_length=20), EmailField()] 以郵件的方式匹配,但是長度不超過20
        
MultiValueField(Field)

抽象類,子類中可以實現聚合多個字典去匹配一個值,要配合MultiWidget使用

Default widget: TextInput
Error message keys: required, invalid, incomplete
fields=()
require_all_fields    Defaults to True
widget
compress(data_list)
SplitDateTimeField(MultiValueField)

將字符串轉化為有效的時間對象類型

Default widget: SplitDateTimeWidget
Error message keys: required, invalid, invalid_date, invalid_time
input_date_formats=[]
        ['%Y--%m--%d', '%m%d/%Y', '%m/%d/%y']用於嘗試將字符串轉換為有效的datetime.date對象的格式列表。
input_time_formats=[]
        ['%H:%M:%S', '%H:%M:%S.%f', '%H:%M']用於嘗試將字符串轉換為有效的datetime.time對象的格式列表
ModelChoiceField(ChoiceField)
Default widget: Select
Error message keys: required, invalid_choice
queryset
empty_label
to_field_name
Error message keys: required, list, invalid_choice, invalid_pk_value
queryset
to_field_name
ModelMultipleChoiceField(ModelChoiceField)
Default widget: SelectMultiple
Empty value: An empty QuerySet
DurationField(Field)
Default widget: TextInput
Error message keys: required, invalid.
BooleanField(Field)

布爾類型

Default widget: CheckboxInput
True or False value.
Error message keys: required
NullBooleanField(BooleanField)
Default widget: NullBooleanSelect
 True, False or None value.
custom

如果內置的不能滿足你的需求,那么你可以自定義自定義的匹配類型

  • 必須繼承django.forms.Field
  • 自己實現clean()
  • 實例化參數:(required, label, initial, widget, help_text)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM