1. 程式人生 > >Django學習手冊 - Form 外掛

Django學習手冊 - Form 外掛

"""
核心:
from django import forms
from django.forms import fields
from django.forms import widgets

class table_name(forms.Form)
  自定義欄位名 = fields.欄位資料型別(欄位引數)


欄位資料型別: 基本欄位: fields.CharField() #字串型別 fields.IntegerField() #整型型別 fields.FloatField() #浮點型別 fields.EmailField() #郵箱 fields.DecimalField() #自定義浮點型別 自引數: max_digits=20 #總長度 decimal_places=20 #小數長度 #檔案型別 #html form上傳時,enctype="multipart/form-data" ,views 中 request.FILES fields.ImageField() #圖片上傳按鈕。需要pillow模組 fields.filefield() #檔案上傳選項 fields.filepathfiled() #對應一個(檔案組成的下拉選單)選擇,必須引數path=''.選項為這個地址裡邊所有的檔案。
                   可選引數recursive=True是否包含子資料夾裡的檔案 #日期/時間 fields.DateField() #日期,格式:2015-09-01 fields.TimeField() #時間,格式:11:11 fields.DateTimeField() #日期時間,2000-01-01 11:11 fields.DurationField() #時間間隔,%d %H:%M:%S.%f #IP地址 fields.GenericIPAddressField() #ip地址型別 #選擇框 fields.booleanfield() #checkbox選擇框 fields.ChoiceField() #choice型別 單選框(返回的值為字串) fields.MultipleChoiceField() #choice型別 多選框 多值為列表(返回的值為字串) 自引數: choices=[(1,'A'),(2,'B'),(3,'C')] fields.TypedChoiceField() #choice型別 單選框(返回的值可定製) fields.TypedMultipleChoiceField() #choice型別 多選框 多值為列表(返回的值可定製) 自引數: coerce = lambda x : int(x) choices=[(1,'A'),(2,'B'),(3,'C')] #自定製 fields.RegexField() #自定義屬性 自引數: regx #自定義正則表示式 FORM 欄位引數: required=True, #必填 max_length=20, #最大值 min_length=5, #最小值 error_messages="required":'不能為空!'}, #錯誤資訊 label="使用者名稱" #標籤名 initial="請輸入使用者名稱" #預設值 show_hidden_initial=True/False #隱藏,且儲存上次資料(檢測兩次輸入) validators=[] #自定製驗證規則 localsize=True/False #是否支援本地化 disabled =True/False #是否能編輯 widget #定製HTML外掛 1.自定義顯示html type 2.設定引數屬性值 3.設定css樣式
"""

 

示例:

from django import forms
from django.forms import fields
from django.forms import widgets

class TestTorm(forms.Form):
    user = fields.CharField(required=True,#必填
                            error_messages={"required":'不能為空!'},
                            label="使用者名稱",
                            )
    age 
= fields.IntegerField(required=True, label="年齡", error_messages={ "required":'不能為空!', "min_value":"太小了", 'max_value':'太老了' }, min_value
=18, max_value=50) email = fields.EmailField(required=True,label="郵箱",error_messages={"required":'不能為空!'}) choice = [(1, 'A'), (2, 'B'), (3, 'C')] aaa = fields.TypedChoiceField(choices=choice) # 通過widget 自定製方式 aab = fields.CharField(widget=widgets.Select()) # 通過__init__ 實時獲取資料庫的資料 傳遞給前端頁面 def __init__(self,*args,**kwargs): from app01 import models super(TestTorm,self).__init__(*args,**kwargs) self.fields['aab'].widget.choices= models.Userinfo.objects.values_list('uid','uname') #例項化時,傳遞值 # obj = TestTorm('可以以字典方式設定預設值')

 

views 頁面:(匯入TestTorm,然後例項化,然後將例項傳遞至前端)

from django.shortcuts import render,HttpResponse
from app01.tests import TestTorm

# Create your views here.

def index(request):
    if request.method == 'GET':
        obj = TestTorm()
        # obj = TestTorm('可以以字典方式設定預設值')
        return render(request, 'index.html',{'obj':obj})
    else:
        obj = TestTorm(request.POST)
        return render(request, 'index.html', {'obj': obj})

obj = TestTorm(request.POST) 獲取前端提交的欄位,驗證是否符合,不符合即 錯誤欄位提示

 

前端頁面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <div>
            {#不同的生成方式一#}
            <form method="post" action="/index/" novalidate  >
                {#novalidate 不載入 #}
                <li>{% csrf_token  %}</li>
                <p>{{ obj.user.label }}{{ obj.user }}{{ obj.errors.user.0 }}</p>
                <p>{{ obj.age.label }}{{ obj.age }}{{ obj.errors.age.0 }}</p>
                <p>{{ obj.email.label }}{{ obj.email }}{{ obj.errors.email.0 }}</p>
                <p>{{ obj.aaa.label }}{{ obj.aaa }}{{ obj.errors.aaa.0 }}</p>
                <p>{{ obj.aab.label }}{{ obj.aab }}{{ obj.errors.aab.0 }}</p>
                <li><input type="submit" class="tijiao" value="提交"></li>
            </form>

            {#不同的生成方式:二   生成整表#}
            <form method="post" action="/index/" novalidate  >
                {{ obj.as_p }}          
                {#p標籤形式#}
            </form>
            <form method="post" action="/index/" novalidate  >
                {{ obj.as_table }}      
                {#table標籤形式#}
            </form>
            <form method="post" action="/index/" novalidate  >
                {{ obj.as_ul }}         
                {#ul標籤形式#}
            </form>
    </div>
</body>
</html>

 

自定製

以上要不滿足需求還可以自定製:
widget 
        1.自定義顯示html type
        2.設定引數屬性值 attr={'class':'classname'}
        3.設定css樣式 attr={'study':'classname'}
# 先匯入這個模組
from django.forms import widgets
# 引數 格式
自定義欄位名 = fields.欄位資料型別(widget=widgets.外掛(引數:attr={'class':'classname'}))
choice = [(1, 'A'), (2, 'B'), (3, 'C')]
aab = fields.CharField(widget=widgets.Select(choices=choice))

 

渲染問題

為什麼Django傳遞至前端的 字串能正常渲染成HTML標籤,不是要加{{ | safe }} 才可以顯示的嗎?????

python 通過拼接字串然後傳遞至前端頁面渲染成HTML標籤
前有學過在 {{text | safe }} 即可渲染
Django中可以:
from django.utils.safestring import mark_safe text = mark_safe(text) 再傳遞至前端也可以達到效果