Python 學習第二十三天 django Form知識

一,django 的form知識html

1,利用views.py生成form表單git

  (1)views.py from表單代碼正則表達式

from django import forms
from django.forms import widgets
from django.forms import fields
class FM(forms.Form):
    # 字段自己只作驗證
    user = fields.CharField(
        error_messages={'required': '用戶名不能爲空.'},                              #required 爲錯誤時提示的內容
        widget=widgets.Textarea(attrs={'class': 'c1'}),
        label="用戶名",
        )
    pwd = fields.CharField(
        max_length=12,
        min_length=6,
        error_messages={'required': '密碼不能爲空.', 'min_length': '密碼長度不能小於6', "max_length": '密碼長度不能大於12'},
        widget=widgets.PasswordInput(attrs={'class': 'c2'})
    )
    email = fields.EmailField(error_messages={'required': '郵箱不能爲空.','invalid':"郵箱格式錯誤"})

    (2)templates代碼數據庫

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title></title>
</head>
<body>
    <form action="/fm/" method="POST">
        {% csrf_token %}
        <p>{{ obj.user }} {{ obj.errors.user.0 }}</p>                         #已字典的形式,獲取後端返回的obj對象,並經過obj.user 生成input標籤
        <p>{{ obj.pwd }} {{ obj.errors.pwd.0 }}</p>                           #obj.error爲後端返回的一個ErrorDict,經過.user獲取user標籤的錯誤信息標籤,在加.0獲取錯誤信息的內容
        <p>{{ obj.email }}{{ obj.errors.email.0 }}</p>
        <input type="submit" value="提交" />
    </form>
</body>
</html>

  (3)views.py 主函數代碼django

from app01 import models
def fm(request):
    if request.method == "GET":
        obj = FM()                                                            #生成FM的對象,用戶已get方法請求時,將obj對象返回到html頁面
        return render(request,'fm.html',{'obj': obj})
    elif request.method == "POST":
        obj = FM(request.POST)
        r1 = obj.is_valid()
        if r1:
            #print(obj.cleaned_data)                                         #若是輸入的值正確,用戶輸入的內容將以字典的當時提交給後臺
            models.UserInfo.objects.create(**obj.cleaned_data)                 #後臺獲取數據後,能夠直接寫入數據庫
        else:
            return render(request,'fm.html', {'obj': obj})

 2,生成其它html後端

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title></title>
</head>
<body>
    <form action="/fm/" method="POST">
        {% csrf_token %}
        {{ obj.as_p }}                          #生成p標籤包裹的input標籤
        {{ obj.as_ul }}                         #生成ul標籤包裹的input標籤
         <tables>
              {{ obj.as_tables}}              #生成tables標籤包裹的input標籤
         </tables>
        <input type="submit" value="提交" />
    </form>
</body>
</html>    

 3,自定義生成的標籤類型以及樣式app

   django中自動生成form標籤,是利用了django內置的forms類的一個widgets 方法,自定義生成form標籤類型方法以下函數

from django.forms import widgets

class FM(forms.Form):
    # 字段自己只作驗證
    user = fields.CharField(
        error_messages={'required': '用戶名不能爲空.'},
     widget=widgets.Textarea #定義標籤的類型爲Textarea widget=widgets.Textarea(attrs={'class': 'c1'}), #這裏定義widget插件的類型爲Textarea,而且爲這個Textarea添加一個c1樣式,也能夠以key-value的形式添加自定義樣式 label="用戶名", )

 4,Form類,建立form類時會定義一些字段和插件,字段用來作數據驗證,插件用來生成htmlui

 (1)django的內置字段插件

Field
    required=True,               是否容許爲空
    widget=None,                 HTML插件
    label=None,                  用於生成Label標籤或顯示內容
    initial=None,                初始值
    help_text='',                幫助信息(在標籤旁邊顯示)
    error_messages=None,         錯誤信息 {'required': '不能爲空', 'invalid': '格式錯誤'}
    show_hidden_initial=False,   是否在當前插件後面再加一個隱藏的且具備默認值的插件(可用於檢驗兩次輸入是否一直)
    validators=[],               自定義驗證規則
    localize=False,              是否支持本地化
    disabled=False,              是否能夠編輯
    label_suffix=None            Label內容後綴
 
 
CharField(Field)
    max_length=None,             最大長度
    min_length=None,             最小長度
    strip=True                   是否移除用戶輸入空白
 
IntegerField(Field)
    max_value=None,              最大值
    min_value=None,              最小值
 
FloatField(IntegerField)
    ...
 
DecimalField(IntegerField)
    max_value=None,              最大值
    min_value=None,              最小值
    max_digits=None,             總長度
    decimal_places=None,         小數位長度
 
BaseTemporalField(Field)
    input_formats=None          時間格式化   
 
DateField(BaseTemporalField)    格式:2015-09-01
TimeField(BaseTemporalField)    格式:11:12
DateTimeField(BaseTemporalField)格式:2015-09-01 11:12
 
DurationField(Field)            時間間隔:%d %H:%M:%S.%f
    ...
 
RegexField(CharField)
    regex,                      自定製正則表達式
    max_length=None,            最大長度
    min_length=None,            最小長度
    error_message=None,         忽略,錯誤信息使用 error_messages={'invalid': '...'}
 
EmailField(CharField)      
    ...
 
FileField(Field)
    allow_empty_file=False     是否容許空文件
 
ImageField(FileField)      
    ...
    注:須要PIL模塊,pip3 install Pillow
    以上兩個字典使用時,須要注意兩點:
        - form表單中 enctype="multipart/form-data"
        - view函數中 obj = MyForm(request.POST, request.FILES)
 
URLField(Field)
    ...
 
 
BooleanField(Field)  
    ...
 
NullBooleanField(BooleanField)
    ...
 
ChoiceField(Field)
    ...
    choices=(),                選項,如:choices = ((0,'上海'),(1,'北京'),)
    required=True,             是否必填
    widget=None,               插件,默認select插件
    label=None,                Label內容
    initial=None,              初始值
    help_text='',              幫助提示
 
 
ModelChoiceField(ChoiceField)
    ...                        django.forms.models.ModelChoiceField
    queryset,                  # 查詢數據庫中的數據
    empty_label="---------",   # 默認空顯示內容
    to_field_name=None,        # HTML中value的值對應的字段
    limit_choices_to=None      # ModelForm中對queryset二次篩選
     
ModelMultipleChoiceField(ModelChoiceField)
    ...                        django.forms.models.ModelMultipleChoiceField
 
 
     
TypedChoiceField(ChoiceField)
    coerce = lambda val: val   對選中的值進行一次轉換
    empty_value= ''            空值的默認值
 
MultipleChoiceField(ChoiceField)
    ...
 
TypedMultipleChoiceField(MultipleChoiceField)
    coerce = lambda val: val   對選中的每個值進行一次轉換
    empty_value= ''            空值的默認值
 
ComboField(Field)
    fields=()                  使用多個驗證,以下:即驗證最大長度20,又驗證郵箱格式
                               fields.ComboField(fields=[fields.CharField(max_length=20), fields.EmailField(),])
 
MultiValueField(Field)
    PS: 抽象類,子類中能夠實現聚合多個字典去匹配一個值,要配合MultiWidget使用
 
SplitDateTimeField(MultiValueField)
    input_date_formats=None,   格式列表:['%Y--%m--%d', '%m%d/%Y', '%m/%d/%y']
    input_time_formats=None    格式列表:['%H:%M:%S', '%H:%M:%S.%f', '%H:%M']
 
FilePathField(ChoiceField)     文件選項,目錄下文件顯示在頁面中
    path,                      文件夾路徑
    match=None,                正則匹配
    recursive=False,           遞歸下面的文件夾
    allow_files=True,          容許文件
    allow_folders=False,       容許文件夾
    required=True,
    widget=None,
    label=None,
    initial=None,
    help_text=''
 
GenericIPAddressField
    protocol='both',           both,ipv4,ipv6支持的IP格式
    unpack_ipv4=False          解析ipv4地址,若是是::ffff:192.0.2.1時候,可解析爲192.0.2.1, PS:protocol必須爲both才能啓用
 
SlugField(CharField)           數字,字母,下劃線,減號(連字符)
    ...
 
UUIDField(CharField)           uuid類型
    ...

 (2)django內置插件

TextInput(Input)
NumberInput(TextInput)
EmailInput(TextInput)
URLInput(TextInput)
PasswordInput(TextInput)
HiddenInput(TextInput)
Textarea(Widget)
DateInput(DateTimeBaseInput)
DateTimeInput(DateTimeBaseInput)
TimeInput(DateTimeBaseInput)
CheckboxInput
Select
NullBooleanSelect
SelectMultiple
RadioSelect
CheckboxSelectMultiple
FileInput
ClearableFileInput
MultipleHiddenInput
SplitDateTimeWidget
SplitHiddenDateTimeWidget
SelectDateWidget

 5,生成choice下拉框

from django import forms
from django.forms import widgets
from django.forms import fields
class FM(forms.Form):
    city1 = fields.ChoiceField(
        choices=[(0,'上海'),(1,'廣州'),(2,'東莞')]           #生成單選的choice
    )
    city2 = fields.MultipleChoiceField(
        choices=[(0,'上海'),(1,'廣州'),(2,'東莞')]          #生成多選的choice


#html代碼

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title></title>
</head>
<body>
    <form action="/fm/" method="POST">
        {% csrf_token %}
        {{ obj.city1 }}
        {{ obj.city2 }}
        <input type="submit" value="提交" />
    </form>
</body>
</html>

 6,經常使用插件使用

# 單radio,值爲字符串
# user = fields.CharField(
#     initial=2,
#     widget=widgets.RadioSelect(choices=((1,'上海'),(2,'北京'),))
# )
 
# 單radio,值爲字符串
# user = fields.ChoiceField(
#     choices=((1, '上海'), (2, '北京'),),
#     initial=2,
#     widget=widgets.RadioSelect
# )
 
# 單select,值爲字符串
# user = fields.CharField(
#     initial=2,
#     widget=widgets.Select(choices=((1,'上海'),(2,'北京'),))
# )
 
# 單select,值爲字符串
# user = fields.ChoiceField(
#     choices=((1, '上海'), (2, '北京'),),
#     initial=2,
#     widget=widgets.Select
# )
 
# 多選select,值爲列表
# user = fields.MultipleChoiceField(
#     choices=((1,'上海'),(2,'北京'),),
#     initial=[1,],
#     widget=widgets.SelectMultiple
# )
 
 
# 單checkbox
# user = fields.CharField(
#     widget=widgets.CheckboxInput()
# )
 
 
# 多選checkbox,值爲列表
# user = fields.MultipleChoiceField(
#     initial=[2, ],
#     choices=((1, '上海'), (2, '北京'),),
#     widget=widgets.CheckboxSelectMultiple
# )

 7,生成html頁面的默認值

from app01 import models
def fm(request):
    if request.method == "GET":
        dic = {                                                                 # 從數據庫中把數據獲取到,並生成一個字典                                   
            "user": 'r1',
            'pwd': '123123',
            'email': 'sdfsd',
            'city1': 1,
            'city2': [1,2]
        }
        obj = FM(initial=dic)                                                   #將字典傳給FM類
        return render(request,'fm.html',{'obj': obj})
相關文章
相關標籤/搜索