如下是forms的例子,展示出forms的做用:html
from django.shortcuts import render,HttpResponse # Create your views here. from django.core.exceptions import NON_FIELD_ERRORS, ValidationError from django import forms # # class BookForm(forms.Form): # title=forms.CharField(max_length=32) # price=forms.IntegerField() # email=forms.EmailField() from django.forms import widgets class UserForm(forms.Form): msg={"required":"該字段不能爲空"} user=forms.CharField(min_length=5, label="用戶名", error_messages=msg, widget=widgets.TextInput(attrs={"class":"form-control"}) ) pwd=forms.CharField(error_messages=msg, label="密碼", min_length=5, widget=widgets.PasswordInput(attrs={"class":"form-control"}) ) r_pwd = forms.CharField(error_messages=msg, min_length=5, label="確認密碼", widget=widgets.PasswordInput(attrs={"class": "form-control"}) ) email=forms.EmailField(error_messages={"invalid":"郵箱格式錯誤"}, label="郵箱", widget=widgets.EmailInput(attrs={"class":"form-control"}) ) ///局部鉤子,能夠加入本身的判斷邏輯 def clean_user(self): val=self.cleaned_data.get("user") ret=UserInfo.objects.filter(user=val).first() if not ret: return val else: raise ValidationError("用戶名已存在!") def clean_pwd(self): val=self.cleaned_data.get("pwd") if val.isdigit(): raise ValidationError("密碼不能是純數字!") else: return val
///全局鉤子,用來判斷兩次密碼的一致性,確認密碼 def clean(self): pwd=self.cleaned_data.get("pwd") r_pwd=self.cleaned_data.get("r_pwd") if pwd and r_pwd: if pwd==r_pwd: return self.cleaned_data else: raise ValidationError("兩次密碼不一致!") else: return self.cleaned_data from app01.models import UserInfo def reg(request): if request.method=="POST": print(request.POST) # 數據校驗 form=UserForm(request.POST) if form.is_valid(): print(form.cleaned_data) UserInfo.objects.create(**form.cleaned_data) #將全部的數據字典經過**打散,建立到表中去 return HttpResponse("OK") else: # print(form.cleaned_data) # print(form.errors) # {"user":["",]} # print(form.errors.get("user")[0]) # {"user":["",]} errors=form.errors #全部的錯誤 print("------>",form.errors.get("__all__")) if form.errors.get("__all__"): g_error=form.errors.get("__all__")[0] #全局鉤子的錯誤信息 return render(request, "reg.html",locals()) else: form=UserForm() return render(request,"reg.html",locals())
reg頁面:能夠經過forms組件進行渲染頁面,不用本身建立頁面git
<div class="container"> <div class="row"> <div class="col-md-8 col-md-offset-2"> <form action="" method="post" novalidate> {% csrf_token %} {% for field in form %} <div class="form-group"> <label for="">{{ field.label }}</label> {{ field }} <span class="error">{{ field.errors.0 }}</span> {% if field.label == "確認密碼" %} <span class="error">{{ g_error|default:"" }}</span> {% endif %} </div> {% endfor %} <input type="reset"> <input type="submit" class="btn btn-success pull-right"> </form> </div> </div> </div>
modelfrom : https://www.cnblogs.com/DI-DIAO/p/8978780.htmdjango