Django的ModelForm的驗證方式相比較form + Model的驗證方式有下列區別:html
一、進行modelForm實例以前先在models中建立兩張表前端
from django.db import models # Create your models here. class UserType(models.Model): caption = models.CharField(max_length=32) class UserInfo(models.Model): username = models.CharField(max_length=32) email = models.EmailField() user_type = models.ForeignKey(to="UserType",to_field='id',on_delete=models.CASCADE)
二、在form.py中建立ModelFormpython
from app01 import models from django import forms from django.forms import fields class UserInfoModelForm(forms.ModelForm): #仍是在forms裏面,須要繼承modelform class Meta: model = models.UserInfo #表示去哪個類裏面去獲取字段 fields = '__all__' #能獲取字段,也能夠對這張表進行增刪改查,all表示展現全部列 #fields = ['username',] #只選擇username列,這個是UserInfo中的字段 #exclude = ["username"] #排除username字段,展現其餘字段
三、在view.py中設置驗證函數數據庫
def index(request): if request.method == "GET": obj = UserInfoModelForm() #驗證時,建立modelform對象 return render(request,'index.html',{'obj':obj}) elif request.method == "POST": obj = UserInfoModelForm(request.POST) #在views函數裏面作校驗 return render(request,'index.html',{'obj':obj})
四、templas中的HTML模板設置django
<body> <form> {{ obj.as_p }} <input type="submit" value="提交"/> </form> </body>
一、ModelForm除modle、fields、exclude組件外,其餘組件介紹:json
ModelForm class Meta: model, # 對應Model的 fields=None, # 字段 exclude=None, # 排除字段 labels=None, # 提示標籤設置 """ labels = { 'username':'用戶名', 'email':'郵箱', } """ help_texts=None, # 輸入框後的幫助提示信息 """ help_texts = { 'username':'....', 'email':'xxx@126.com', } """ widgets=None, # 自定義插件 """ from django.forms import widgets as Fwidgets #須要導入html插件,而且須要從新命名,由於跟關鍵字重複了 #html插件 widgets = { "username":Fwidgets.Textarea(attrs={'class':'c1'}) #加上屬性 } """ error_messages=None, # 自定義錯誤信息(總體錯誤信息from django.core.exceptions import NON_FIELD_ERRORS) """ error_messages = { "__all__":{ #定義總體的錯誤信息 }, 'email':{ 'required':'郵箱不爲空', # 根據required是code值 'invalid':"郵箱格式錯誤" } } """ field_classes=None # 自定義字段類 (也能夠自定義字段) """ #把標籤的格式轉換爲其餘格式,這邊須要導入fields,可是須要從新起一個別名否則會跟自身的fields衝突,就會報錯 from django.forms import fields as Ffields #導入fields,而且取一個別名 field_classes = { 'email':Ffields.URLField #把email格式轉換爲url格式 } """ localized_fields=('birth_date',) # 本地化,如:根據不一樣時區顯示數據 """ 如: 數據庫中 2016-12-27 04:10:57 setting中的配置 TIME_ZONE = 'Asia/Shanghai' USE_TZ = True 則顯示: 2016-12-27 12:10:57 """ # ##自定義字段 """ #modelform能夠自定義一些字段,好比10天免登陸,這個東西不須要提交到後臺的 class UserInfoModelForm(forms.ModelForm): #自定義字段 is_rmb = Ffields.CharField( widget=Fwidgets.CheckboxInput() #modelform能夠自定義一些字段,好比10天免登陸,這個東西不須要提交給後臺的 ) class Meta: model = models.UserInfo fields = "__all__" """
二、models下ForeignKey、ManyToMany的數據保存app
1 class UserType(models.Model): 2 caption = models.CharField(max_length=32) 3 4 5 class UserGroup(models.Model): 6 name = models.CharField(max_length=32) 7 8 class UserInfo(models.Model): 9 username = models.CharField(max_length=32) 10 email = models.EmailField() 11 user_type = models.ForeignKey(to="UserType",to_field='id',on_delete=models.CASCADE) 12 u2g = models.ManyToManyField(UserGroup) #跟上面的UserGroup創建多對多關係
#1對1的外鍵,驗證經過後,save()一下,數據就直接能夠保存在數據庫了 def index(request): if request.method == "GET": obj = UserInfoModelForm() return render(request,'index.html',{'obj':obj}) elif request.method == "POST": obj = UserInfoModelForm(request.POST) if obj.is_valid(): obj.save() #驗證成功以後,是直接保存在數據庫中 """ form + model中的驗證函數 # print(obj.is_valid()) # print(obj.cleaned_data) # print(obj.errors.as_json()) """ return render(request,'index.html',{'obj':obj})
1 def index(request): 2 if request.method == "GET": 3 obj = UserInfoModelForm() 4 return render(request,'index.html',{'obj':obj}) 5 elif request.method == "POST": 6 obj = UserInfoModelForm(request.POST) 7 if obj.is_valid(): 8 # commit爲true時將會同時保存回將UserInfo表和其多對多關係表同時進行保存,爲false時什麼都不會作,須要本身手動保存UserInfo表和其多對多關係表 9 obj.save(commit=True) 10 11 instance = obj.save(commit=False) # 什麼保存操做都不回作 12 instance.save() # 這個不等於obj.save(),它只保存當前這個表數據,不會保存其多對多關係表 13 obj.save_m2m() # 保存其多對多關係表 14 return render(request,'index.html',{'obj':obj})
三、示例ide
1 from app01 import models 2 3 4 def user_list(request): 5 li = models.UserInfo.objects.all().select_related('user_type') #select_related 只能是外鍵,不能是多對多 6 return render(request,'user_list.html',{'li':li}) 7 8 def user_edit(request,nid): 9 if request.method == "GET": 10 user_obj = models.UserInfo.objects.filter(id=nid).first() 11 mf = UserInfoModelForm(instance=user_obj) #把對象傳進來,在前端就能顯示默認值 12 return render(request,'user_edit.html',{'mf':mf,'nid':nid}) 13 elif request.method == "POST": 14 user_obj = models.UserInfo.objects.filter(id=nid).first() 15 mf = UserInfoModelForm(request.POST,instance=user_obj) #我把數據提交過來了,而且我拿到對哪一個對象進行更新數據 16 if mf.is_valid(): 17 mf.save() 18 else: 19 print(mf.errors.as_json()) 20 return render(request,'user_edit.html',{'mf':mf,'nid':nid})
<body> <ul> {% for row in li %} <li>{{ row.username }}-{{ row.user_type.caption }}-<a href="/edit-{{ row.id }}/">編輯</a></li> {% endfor %} </ul> </body>
<body> <form method="post" action="/edit-{{ nid }}/"> {{ mf.as_p }} <input type="submit" value="提交"/> </form> </body>