日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python django 表单_Django-表单处理

發布時間:2025/3/21 python 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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-表单处理的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。