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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

Python的Django框架中forms表单类的使用方法详解

發(fā)布時(shí)間:2023/12/20 python 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python的Django框架中forms表单类的使用方法详解 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Form

Form的驗(yàn)證思路

前端:form表單

后臺:創(chuàng)建form類,當(dāng)請求到來時(shí),先匹配,匹配出正確和錯(cuò)誤信息。

Django的Form驗(yàn)證實(shí)例

創(chuàng)建project,進(jìn)行基礎(chǔ)配置文件配置

settings.py

settings.py之csrf注銷

__init__.py

urls.py

views.account.py:

from django.shortcuts import render,HttpResponse from app01.forms import Form1def form1(request):if request.method=="POST": #這里POST一定要大寫#通常獲取請求信息#request.POST.get("user",None)#request.POST.get("pwd",None)#獲取請求內(nèi)容,做驗(yàn)證f = Form1(request.POST) #request.POST:將接收到的數(shù)據(jù)通過Form1驗(yàn)證if f.is_valid(): #驗(yàn)證請求的內(nèi)容和Form1里面的是否驗(yàn)證通過。通過是True,否則False。print(f.cleaned_data) #cleaned_data類型是字典,里面是提交成功后的信息else: #錯(cuò)誤信息包含是否為空,或者符合正則表達(dá)式的規(guī)則print(type(f.errors),f.errors) #errors類型是ErrorDict,里面是ul,li標(biāo)簽return render(request,"account/form1.html",{"error":f.errors})return render(request,"account/form1.html")

html:

<body> {#{{ error }}接收后臺返回的錯(cuò)誤信息封裝在ul,li標(biāo)簽里面:#}{{ error }}<form action="/form1/" method="POST"><div><input type="text" name="user" /></div><div><input type="text" name="pwd" /></div><div><input type="submit" value="提交" /></div></form> </body>

forms.py:

from django import formsclass Form1(forms.Form):user = forms.CharField()pwd = forms.CharField()

訪問頁面:

沒有輸入內(nèi)容后提交,通過模板語言展示了錯(cuò)誤信息

Django強(qiáng)大之form驗(yàn)證時(shí)不用自定義錯(cuò)誤信息就可以返回錯(cuò)誤信息到前端以標(biāo)簽方式展現(xiàn)。

.is_valid():返回True或者False

.cleaned_data:通過驗(yàn)證后的數(shù)據(jù)

errors:
.error.get("user",None)error封裝所有的錯(cuò)誤信息,如果沒有獲取到,默認(rèn)為None。

如:

.error.get["pwd"]直接獲取到ul、li。

如:

forms.py

from django import formsclass Form1(forms.Form):user = forms.CharField()pwd = forms.CharField()

HTML:

<form action="/form1/" method="POST"><div class="input-group">{#接收后臺傳過來的form對象,自動生成input標(biāo)簽#}{{ form.user }}{#從后臺傳過來的error是字典,直接{{ error.user.0 }}呈現(xiàn)錯(cuò)誤信息#}{#如果后臺返回了錯(cuò)誤信息,將錯(cuò)誤信息放入span標(biāo)簽,在頁面顯示,否則不顯示#}{% if error.user.0 %}<span>{{ error.user.0 }}</span>{% endif %}</div><div class="input-group">{{ form.pwd }}{% if error.pwd.0 %}<span>{{ error.pwd.0 }}</span>{% endif %}</div><div><input type="submit" value="提交" /></div></form>

account.py

def form1(request):if request.method == "POST":f = Form1(request.POST)if f.is_valid():print(f.cleaned_data)else:return render(request,"account/form1.html",{"error":f.errors,"form":f})else:# 如果不是post提交數(shù)據(jù),就不傳參數(shù)創(chuàng)建對象,并將對象返回給前臺,直接生成input標(biāo)簽,內(nèi)容為空f = Form1()return render(request,"account/form1.html",{"form":f})return render(request,"account/form1.html")

注:

?頁面展示:

注:這里的input標(biāo)簽是后端返回form對象到前端通過{{ form.xxx?}}所創(chuàng)建的

更強(qiáng)大的功能:

?forms里面的字段:

required:是否可以為空。required=True 不可以為空,required=False 可以為空 max_length=4 最多4個(gè)值,超過不會顯示 min_length=2 至少兩個(gè)值,少于兩個(gè)會返回提示信息 error_messages={'required': '郵箱不能為空', 'invalid': '郵箱格式錯(cuò)誤'} 自定義錯(cuò)誤信息,invalid 是格式錯(cuò)誤 widget=forms.TextInput(attrs={'class': 'c1'}) 給自動生成的input標(biāo)簽自定義class屬性 widget=forms.Textarea() 生成Textarea標(biāo)簽。widget默認(rèn)生成input標(biāo)簽

實(shí)戰(zhàn):

models.py

from django.db import models# Create your models here. class Author(models.Model):"""作者"""name = models.CharField(max_length=100)age = models.IntegerField()class BookType(models.Model):"""圖書類型"""caption = models.CharField(max_length=64)class Book(models.Model):"""圖書"""name = models.CharField(max_length=64)pages = models.IntegerField()price = models.DecimalField(max_digits=10,decimal_places=2)pubdate = models.DateField()authors = models.ManyToManyField(Author)book_type = models.ForeignKey(BookType)

forms.py:

from django import forms from app01 import modelsclass Form1(forms.Form):user = forms.CharField(widget=forms.TextInput(attrs={'class': 'c1'}),error_messages={'required': '用戶名不能為空'}, )pwd = forms.CharField(max_length=4, min_length=2,required=True)email = forms.EmailField(error_messages={'required': '郵箱不能為空', 'invalid': '郵箱格式錯(cuò)誤'})memo = forms.CharField(widget=forms.Textarea())#直接寫數(shù)據(jù)# user_type_choice = (# (0, '普通用戶'),# (1, '高級用戶'),# )#通過BookType表查詢信息,values_list拿到的是元組。id作為value顯示,caption作為text在頁面顯示# user_type_choice = models.BookType.objects.values_list('id', 'caption')# book_type = forms.CharField(# widget=forms.widgets.Select(choices=user_type_choice, attrs={'class': "form-control"}))#寫上以下代碼就不用擔(dān)心數(shù)據(jù)庫添加了數(shù)據(jù)而不能及時(shí)獲取了def __init__(self, *args, **kwargs):#每次創(chuàng)建Form1對象時(shí)執(zhí)行init方法super(Form1, self).__init__(*args, **kwargs)self.fields['book_type'] = forms.CharField(widget=forms.widgets.Select(choices=models.BookType.objects.values_list('id', 'caption'),attrs={'class': "form-control"}))

HTML:

<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>Title</title><style>.input-group{position: relative;padding: 20px;width: 250px;}.input-group input{width: 200px;display: inline-block;}.inline-group span{display: inline-block;position: absolute;height: 12px;font-size: 8px;border: 1px solid red;background-color: coral;color: white;top: 41px;left: 20px;width: 202px;}</style> </head> <body><form action="/form1/" method="POST"><div class="input-group"> {# 接收后臺傳過來的form對象,自動生成input標(biāo)簽#}{{ form.user }} {# 從后臺傳過來的error是字典,直接{{ error.user.0 }}呈現(xiàn)錯(cuò)誤信息#} {# 如果后臺返回了錯(cuò)誤信息,將錯(cuò)誤信息放入span標(biāo)簽,在頁面顯示,否則不顯示#}{% if error.user.0 %}<span>{{ error.user.0 }}</span>{% endif %}</div><div class="input-group">{{ form.pwd }}{% if error.pwd.0 %}<span>{{ error.pwd.0 }}</span>{% endif %}</div><div class="input-group">{{ form.email }}{% if error.email.0 %}<span>{{ error.email.0 }}</span>{% endif %}</div><div class="input-group">{{ form.memo }}{% if error.memo.0 %}<span>{{ error.memo.0 }}</span>{% endif %}</div><div class="input-group">{{ form.book_type }}{% if error.book_type.0 %}<span>{{ error.book_type.0 }}</span>{% endif %}</div><div><input type="submit" value="提交" /></div></form></body> </html>

account.py:

from django.shortcuts import render,HttpResponse from app01.forms import Form1 from app01.models import *# def test(req): # BookType.objects.create(caption='技術(shù)') # BookType.objects.create(caption='文學(xué)') # BookType.objects.create(caption='動漫') # BookType.objects.create(caption='男人裝') # return HttpResponse("ok")def form1(request):if request.method == "POST":f = Form1(request.POST)if f.is_valid():print(f.cleaned_data)else:return render(request,"account/form1.html",{"error":f.errors,"form":f})else:# 如果不是post提交數(shù)據(jù),就不傳參數(shù)創(chuàng)建對象,并將對象返回給前臺,直接生成input標(biāo)簽,內(nèi)容為空f = Form1()return render(request,"account/form1.html",{"form":f})return render(request,"account/form1.html")

Django里面沒有手機(jī)驗(yàn)證,沒有的需要自定義

示例:

Form

View

總結(jié)

以上是生活随笔為你收集整理的Python的Django框架中forms表单类的使用方法详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。