python django 表单_Django-表单处理
這個世界像是蒙著一層白霧,看不清這個世界也看不見自己,只是感覺到腳下還踩著堅實的土地,由此證明自己還活著,除了自己一無所有。
使用表單
以前提交表單內容數據都是在HTML中寫一個表單,然后發送到后端,后端進行處理。
但是在Django中變得簡單明了,首先在應用的目錄下新建一個forms.py
# NHDZ/app/forms.py
# coding:utf-8
from django import forms
import datetime
class Login(forms.Form):
username = forms.CharField(label='用戶名', widget=forms.TextInput, initial='admin', label_suffix=':x:',required=True)
# 這里設置表單傳送過來的數據,并且自動在前端生成表單
# label 表單的前綴顯示 '用戶名:'
# widget 類型為text
# initial 輸入框內的默認值 為 admin
# label_suffix 后綴,默認是 用戶名: 現在變成了 用戶名:x:
# required 給字段添加必填屬性,不能空著。
password = forms.CharField(label='密碼', widget=forms.PasswordInput, initial=datetime.date.today(),help_text='在這里輸入你的密碼')
# initial 默認值 可以動態獲取日期
# help_text 幫助文檔
然后就能在視圖中編寫登陸部分的功能
# NHDZ/app/login.py
# coding:utf-8
from .froms import Login
from django.shortcuts import render
from django.http import HttpResponse
def index(request):
# 登陸頁面
login_form = Login()
# 實例化表單,然后把表單的內容獲取后,渲染到html頁面
return render(request, 'login.html', {'login_form': login_form})
def login(request):
# 登陸驗證
if request.method == 'POST':
do_login = Login(request.POST)
# 實例化傳遞過來的數據
if do_login.is_valid():
# 判斷數據是否合法
username = do_login.cleaned_data['username']
# 這里的 cleaned_data方法可以清洗數據,然后獲取數據
passowrd = do_login.cleaned_data['password']
return HttpResponse(username + '
' + passowrd)
然后在templates文件夾新建一個login.html文件,內容如下
{% csrf_token %}
{{login_form}}
登陸
最后修改一些路由文件urls.py
# NHDZ/app/urls.py
from django.urls import path
from .views import Index,Add_Images,Add_Texts
from .show import show
from .login import index,login
urlpatterns = [
path('',Index,name='index'),
path('add_texts/',Add_Texts,name='add_texts'),
path('add_images/',Add_Images,name='add_images'),
path('show/',show,name='show'),
path('login/',index,name='login'),
path('login_success/',login,name='login_success')
]
這個時候添加功能差不多完成了,訪問一下看看是不是生成了表單
點擊登陸后,返回結果
自動渲染格式
在演示的login.html中,我只是傳入了 就自動生成了表單,但是樣式還是非常簡陋的,這里使用Django提供自帶的樣式表渲染就可以變得美美噠
將表單渲染成一個表格元素,每個輸入框作為一個
標簽
將表單的每個輸入框包裹在一個
標簽內 tags
將表單渲染成一個列表元素,每個輸入框作為一個
標簽
注意:你要自己手動編寫和標簽。
比如我現在把login.html文件修改成這樣
{% csrf_token %}
{{login_form.as_p}}
登陸
現在前端顯示的表的樣式就變成醬紫
手動渲染格式
在希望引用bootstrap時候,需要手動渲染每個地方的樣式表,可以通過如下方式進行獲取到表的內容,然后進行渲染
使用直接獲取方式
可以使用 表單.屬性 的方式獲取到表單的內容輸入
{% csrf_token %}
用戶id:{{ login_form.username }}
# 這里的 login_form.username 就是直接從表單中獲取到數據,然后可以自己添加樣式
密碼:{{login_form.password}}
登陸
使用迭代表方式獲取
傳入的數據進行迭代
{% csrf_token %}
{% for field in login_form %}
# 這里對傳入的表單迭代
{{ field.label_tag }}:{{ field }}
# field 是表單輸入的內容,field.label_tag 是表單的樣式表
# 然后使用 p 標簽進行渲染,當然可以把p標簽替換css樣式
{{ field.errors }}
# 如果表單錯誤,提示錯誤內容
{% endfor %}
登陸
渲染表單錯誤信息
在表單里處理錯誤信息。對于每一個表單字段的錯誤,它其實會實際生成一個無序列表,參考下面的樣子:
- Sender is required.
這個列表有個默認的CSS樣式類errorlist,如果你想進一步定制這個樣式,可以循環錯誤列表里的內容,然后單獨設置樣式:
{% if login_form.errors %}
{% for error in form.username.errors %}
{{ error|escape }}
{% endfor %}
{% endif %}
一切非字段的錯誤信息,比如表單的錯誤,隱藏字段的錯誤都保存在中,上面的例子,我們把它放在了表單的外圍上面,它將被按下面的HTML和CSS格式渲染:
- Generic validation error
使用 CSS 樣式表
總結了一下,可以通過三種(說到底就是兩種)方式設置層疊樣式表
后端處理
在Django編寫forms.py表單模型的時候,能夠通過設置Field類的屬性設置樣式,比如
class Login(forms.Form):
username = forms.CharField(label='用戶名', widget=forms.TextInput(attrs={'size': '20'}))
# 代表大小為20px
然后 在templates的login.html修改成
{% csrf_token %}
{{login_form}}
登陸
結果如下
使用前端處理
如上文的手動渲染格式一樣,使用field.xxx獲取表單的屬性,然后自己在前端html編寫css
需要注意的是,如果你在前端手動獲取了表單的內容數據后然后自己寫css渲染后,后端代碼中設置的樣式不起作用
半自動處理
前端框架習慣bootstrap,實踐后發現能通過前后端設置bootstrap的屬性,我為了省事兒沒有在static文件夾保存bootstrap的文件,直接引用了
后端代碼如下:
class Login(forms.Form):
username = forms.CharField(label='用戶名', widget=forms.TextInput(attrs={'class': 'form-control'}))
# class:form-control 是bootstrap的輸入框的一個樣式
前端代碼如下:
登陸# 通過這直接遠程引用了bootstrap
{% csrf_token %}
# 這里是屬于bootartap的一個柵欄樣式
{{login_form}}
登陸
返回的結果:
熟悉的界面~
上傳文件
走FORMS
首先,寫一個form模型,它必須包含一個FileField:
# forms.py
from django import forms
class UploadFileForm(forms.Form):
title = forms.CharField(max_length=50)
file = forms.FileField()
處理這個表單的視圖將在request.FILES中收到文件數據,可以用request.FILES[‘file’]來獲取上傳文件的具體數據,其中的鍵值‘file’是根據file = forms.FileField()的變量名來的。
注意:request.FILES只有在請求方法為POST,并且提交請求的具有enctype=”multipart/form-data”屬性時才有效。 否則,request.FILES將為空。
下面是一個接收上傳文件的視圖范例:
# views.py
from django.http import HttpResponseRedirect
from django.shortcuts import render
from .forms import UploadFileForm
# 另外寫一個處理上傳過來的文件的方法,并在這里導入
from somewhere import handle_uploaded_file
def upload_file(request):
if request.method == 'POST':
form = UploadFileForm(request.POST, request.FILES) # 注意獲取數據的方式
if form.is_valid():
handle_uploaded_file(request.FILES['file'])
return HttpResponseRedirect('/success/url/')
else:
form = UploadFileForm()
return render(request, 'upload.html', {'form': form})
請注意,必須將request.FILES傳遞到form的構造函數中。
form = UploadFileForm(request.POST, request.FILES)
下面是一個處理上傳文件的方法的參考例子:
def handle_uploaded_file(f):
with open('some/file/name.txt', 'wb+') as destination:
for chunk in f.chunks():
destination.write(chunk)
遍歷UploadedFile.chunks(),而不是直接使用read()方法,能確保大文件不會占用系統過多的內存。
走MODELS
如果是通過模型層的model來指定上傳文件的保存方式的話,使用ModelForm更方便。 調用form.save()的時候,文件對象會保存在相應的FileField的upload_to參數指定的地方。
from django.http import HttpResponseRedirect
from django.shortcuts import render
from .forms import ModelFormWithFileField
def upload_file(request):
if request.method == 'POST':
form = ModelFormWithFileField(request.POST, request.FILES)
if form.is_valid():
# 這么做就可以了,文件會被保存到Model中upload_to參數指定的位置
form.save()
return HttpResponseRedirect('/success/url/')
else:
form = ModelFormWithFileField()
return render(request, 'upload.html', {'form': form})
如果手動構造一個對象,還可以簡單地把文件對象直接從request.FILES賦值給模型:
from django.http import HttpResponseRedirect
from django.shortcuts import render
from .forms import UploadFileForm
from .models import ModelWithFileField
def upload_file(request):
if request.method == 'POST':
form = UploadFileForm(request.POST, request.FILES)
if form.is_valid():
instance = ModelWithFileField(file_field=request.FILES['file'])
instance.save()
return HttpResponseRedirect('/success/url/')
else:
form = UploadFileForm()
return render(request, 'upload.html', {'form': form})
前端表單常用屬性屬性 說明
{{ login_form.label }} 字段對應的label信息
{{ login_form.label_tag }} 自動生成字段的label標簽,注意與{{ login_form.label }}的區別。
{{ login_form.id_for_label }} 自定義字段標簽的id
{{ login_form.value }} 當前字段的值,比如一個Email字段的值someone@example.com
{{ login_form.html_name }} 指定字段生成的input標簽中name屬性的值
{{ login_form.help_text }} 字段的幫助信息
{{ login_form.errors }} 包含錯誤信息的元素
{{ login_form.is_hidden }} 用于判斷當前字段是否為隱藏的字段,如果是,返回True
{{ login_form.field }} 返回字段的參數列表。例如{{ char_field.field.max_length }}
表單內置的Field類
對于每個字段類,介紹其默認的widget,當輸入為空時返回的值,以及采取何種驗證方式。‘規范化為’表示轉換為PYthon的何種對象。可用的錯誤信息鍵,表示該字段可自定義錯誤信息的類型(字典的鍵)。
1. BooleanField默認的Widget:CheckboxInput
空值:False
規范化為:Python的True或者False
可用的錯誤信息鍵:required
##2. CharField
默認的Widget:TextInput
空值:與empty_value給出的任何值。
規范化為:一個Unicode 對象。
驗證max_length或min_length,如果設置了這兩個參數。 否則,所有的輸入都是合法的。
可用的錯誤信息鍵:min_length, max_length, required
有四個可選參數:
max_length,min_length:設置字符串的最大和最小長度。
strip:如果True(默認),去除輸入的前導和尾隨空格。
empty_value:用來表示“空”的值。 默認為空字符串。
##3. ChoiceField
默認的Widget:Select
空值:’’(一個空字符串)
規范化為:一個Unicode 對象。
驗證給定的值是否在選項列表中。
可用的錯誤信息鍵:required, invalid_choice
參數choices:用來作為該字段選項的一個二元組組成的可迭代對象(例如,列表或元組)或者一個可調用對象。格式與用于和ORM模型字段的choices參數相同。
##4. TypedChoiceField
像ChoiceField一樣,只是還有兩個額外的參數:coerce和empty_value。
默認的Widget:Select
空值:empty_value參數設置的值。
規范化為:coerce參數類型的值。
驗證給定的值在選項列表中存在并且可以被強制轉換。
可用的錯誤信息的鍵:required, invalid_choice
##5. DateField
默認的Widget:DateInput
空值:None
規范化為:datetime.date對象。
驗證給出的值是一個datetime.date、datetime.datetime 或指定日期格式的字符串。
錯誤信息的鍵:required, invalid
接收一個可選的參數:input_formats。一個格式的列表,用于轉換字符串為datetime.date對象。
如果沒有提供input_formats,默認的輸入格式為:
['%Y-%m-%d', # '2006-10-25'
'%m/%d/%Y', # '10/25/2006'
'%m/%d/%y'] # '10/25/06'
另外,如果你在設置中指定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'
##6. DateTimeField
默認的Widget:DateTimeInput
空值:None
規范化為:Python的datetime.datetime對象。
驗證給出的值是一個datetime.datetime、datetime.date或指定日期格式的字符串。
錯誤信息的鍵:required, invalid
接收一個可選的參數:input_formats
如果沒有提供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'
7. DecimalField默認的Widget:當Field.localize是False時為NumberInput,否則為TextInput。
空值:None
規范化為:Python decimal對象。
驗證給定的值為一個十進制數。 忽略前導和尾隨的空白。
錯誤信息的鍵:max_whole_digits, max_digits, max_decimal_places,max_value, invalid, required,min_value
接收四個可選的參數:
max_value,min_value:允許的值的范圍,需要賦值decimal.Decimal對象,不能直接給個整數類型。
max_digits:值允許的最大位數(小數點之前和之后的數字總共的位數,前導的零將被刪除)。
decimal_places:允許的最大小數位。
##8. DurationField
默認的Widget:TextInput
空值:None
規范化為:Python timedelta。
驗證給出的值是一個字符串,而且可以轉換為timedelta對象。
錯誤信息的鍵:required, invalid.
9. EmailField
默認的Widget:EmailInput
空值:''(一個空字符串)
規范化為:Unicode 對象。
使用正則表達式驗證給出的值是一個合法的郵件地址。
錯誤信息的鍵:required, invalid
兩個可選的參數用于驗證,max_length 和min_length。
##10. FileField
默認的Widget:ClearableFileInput
空值:None
規范化為:一個UploadedFile對象,它封裝文件內容和文件名到一個對象內。
驗證非空的文件數據已經綁定到表單。
錯誤信息的鍵:missing, invalid, required, empty, max_length
具有兩個可選的參數用于驗證:max_length 和 allow_empty_file。
##11. FilePathField
默認的Widget:Select
空值:None
規范化為:Unicode 對象。
驗證選擇的選項在選項列表中存在。
錯誤信息的鍵:required, invalid_choice
這個字段允許從一個特定的目錄選擇文件。 它有五個額外的參數,其中的path是必須的:
path:要列出的目錄的絕對路徑。 這個目錄必須存在。
recursive:如果為False(默認值),只用直接位于path下的文件或目錄作為選項。如果為True,將遞歸訪問這個目錄,其內所有的子目錄和文件都將作為選項。
match:正則表達模式;只有具有與此表達式匹配的文件名稱才被允許作為選項。
allow_files:可選。默認為True。表示是否應該包含指定位置的文件。它和allow_folders必須有一個為True。
allow_folders可選。默認為False。表示是否應該包含指定位置的目錄。
##12. FloatField
默認的Widget:當Field.localize是False時為NumberInput,否則為TextInput。
空值:None
規范化為:Float 對象。
驗證給定的值是一個浮點數。
錯誤信息的鍵:max_value, invalid, required, min_value
接收兩個可選的參數用于驗證,max_value和min_value,控制允許的值的范圍。
##13. ImageField
默認的Widget:ClearableFileInput
空值:None
規范化為:一個UploadedFile 象,它封裝文件內容和文件名為一個單獨的對象。
驗證文件數據已綁定到表單,并且該文件是Pillow可以解析的圖像格式。
錯誤信息的鍵:missing, invalid, required, empty, invalid_image
使用ImageField需要安裝Pillow(pip install pillow)。如果在上傳圖片時遇到圖像損壞錯誤,通常意味著使用了Pillow不支持的格式。
##14. IntegerField
默認的Widget:當Field.localize是False時為NumberInput,否則為TextInput。
空值:None
規范化為:Python 整數或長整數。
驗證給定值是一個整數。 允許前導和尾隨空格,類似Python的int()函數。
錯誤信息的鍵:max_value, invalid, required, min_value
兩個可選參數:max_value和min_value,控制允許的值的范圍。
##15. GenericIPAddressField
包含IPv4或IPv6地址的字段。
默認的Widget:TextInput
空值:''(一個空字符串)
規范化為:一個Unicode對象。
驗證給定值是有效的IP地址。
錯誤信息的鍵:required, invalid
有兩個可選參數:protocol和unpack_ipv4
##16. MultipleChoiceField
默認的Widget:SelectMultiple
空值:[](一個空列表)
規范化為:一個Unicode 對象列表。
驗證給定值列表中的每個值都存在于選擇列表中。
錯誤信息的鍵:invalid_list, invalid_choice, required
##17. TypedMultipleChoiceField
類似MultipleChoiceField,除了需要兩個額外的參數,coerce和empty_value。
默認的Widget:SelectMultiple
空值:empty_value
規范化為:coerce參數提供的類型值列表。
驗證給定值存在于選項列表中并且可以強制。
錯誤信息的鍵:required, invalid_choice
##18. NullBooleanField
默認的Widget:NullBooleanSelect
空值:None
規范化為:Python None, False 或True 值。
不驗證任何內容(即,它從不引發ValidationError)。
##19.RegexField
默認的Widget:TextInput
空值:’’(一個空字符串)
規范化為:一個Unicode 對象。
驗證給定值與某個正則表達式匹配。
錯誤信息的鍵:required, invalid
需要一個必需的參數:regex,需要匹配的正則表達式。
還可以接收max_length,min_length和strip參數,類似CharField。
##20. SlugField
默認的Widget:TextInput
空值:’’(一個空字符串)
規范化為:一個Unicode 對象。
驗證給定的字符串只包括字母、數字、下劃線及連字符。
錯誤信息的鍵:required, invalid
此字段用于在表單中表示模型的SlugField。
##21. TimeField
默認的Widget:TextInput
空值:None
規范化為:一個Python 的datetime.time 對象。
驗證給定值是datetime.time或以特定時間格式格式化的字符串。
錯誤信息的鍵:required, invalid
接收一個可選的參數:input_formats,用于嘗試將字符串轉換為有效的datetime.time對象的格式列表。
如果沒有提供input_formats,默認的輸入格式為:
'%H:%M:%S', # '14:30:59'
'%H:%M', # '14:30'
##22. URLField
默認的Widget:URLInput
空值:’’(一個空字符串)
規范化為:一個Unicode 對象。
驗證給定值是個有效的URL。
錯誤信息的鍵:required, invalid
可選參數:max_length和min_length
##23. UUIDField
默認的Widget:TextInput
空值:’’(一個空字符串)
規范化為:UUID對象。
錯誤信息的鍵:required, invalid
##24. ComboField
默認的Widget:TextInput
空值:’’(一個空字符串)
規范化為:Unicode 對象。
根據指定為ComboField的參數的每個字段驗證給定值。
錯誤信息的鍵:required, invalid
接收一個額外的必選參數:fields,用于驗證字段值的字段列表(按提供它們的順序)。
>>> from django.forms import ComboField
>>> f = ComboField(fields=[CharField(max_length=20), EmailField()])
>>> f.clean('test@example.com')
'test@example.com'
>>> f.clean('longemailaddress@example.com')
Traceback (most recent call last):
...
ValidationError: ['Ensure this value has at most 20 characters (it has 28).']
##25. MultiValueField
默認的Widget:TextInput
空值:’’(一個空字符串)
規范化為:子類的compress方法返回的類型。
根據指定為MultiValueField的參數的每個字段驗證給定值。
錯誤信息的鍵:incomplete, invalid, required
##26. SplitDateTimeField
默認的Widget:SplitDateTimeWidget
空值:None
規范化為:Python datetime.datetime 對象。
驗證給定的值是datetime.datetime或以特定日期時間格式格式化的字符串。
錯誤信息的鍵:invalid_date, invalid, required, invalid_time
總結
以上是生活随笔為你收集整理的python django 表单_Django-表单处理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: shell开启飞行模式_手机上的飞行模式
- 下一篇: python的pandas包使用教程_「