ModelForm:
大家在寫表單的時(shí)候,會(huì)發(fā)現(xiàn)表單中的Field
和模型中的Field
基本上是一模一樣的围橡,而且表單中需要驗(yàn)證的數(shù)據(jù)革答,也就是我們模型中需要保存的。那么這時(shí)候我們就可以將模型中的字段和表單中的字段進(jìn)行綁定莲镣。
比如現(xiàn)在有個(gè)Article
的模型福稳。示例代碼如下:
from django.db import models
from django.core import validators
class Article(models.Model):
title = models.CharField(max_length=10,validators=[validators.MinLengthValidator(limit_value=3)])
content = models.TextField()
author = models.CharField(max_length=100)
category = models.CharField(max_length=100)
create_time = models.DateTimeField(auto_now_add=True)
那么在寫表單的時(shí)候,就不需要把Article
模型中所有的字段都一個(gè)個(gè)重復(fù)寫一遍了瑞侮。示例代碼如下:
from django import forms
class MyForm(forms.ModelForm):
class Meta:
model = Article
fields = "__all__"
MyForm
是繼承自forms.ModelForm
的圆,然后在表單中定義了一個(gè)Meta
類,在Meta
類中指定了model=Article
半火,以及fields="__all__"
越妈,這樣就可以將Article
模型中所有的字段都復(fù)制過(guò)來(lái),進(jìn)行驗(yàn)證钮糖。如果只想針對(duì)其中幾個(gè)字段進(jìn)行驗(yàn)證梅掠,那么可以給fields
指定一個(gè)列表,將需要的字段寫進(jìn)去店归。比如只想驗(yàn)證title
和content
阎抒,那么可以使用以下代碼實(shí)現(xiàn):
from django import forms
class MyForm(forms.ModelForm):
class Meta:
model = Article
fields = ['title','content']
如果要驗(yàn)證的字段比較多,只是除了少數(shù)幾個(gè)字段不需要驗(yàn)證消痛,那么可以使用exclude
來(lái)代替fields
且叁。比如我不想驗(yàn)證category
,那么示例代碼如下:
class MyForm(forms.ModelForm):
class Meta:
model = Article
exclude = ['category']
自定義錯(cuò)誤消息:
使用ModelForm
秩伞,因?yàn)樽侄味疾皇窃诒韱沃卸x的谴古,而是在模型中定義的,因此一些錯(cuò)誤消息無(wú)法在字段中定義稠歉。那么這時(shí)候可以在Meta
類中掰担,定義error_messages
,然后把相應(yīng)的錯(cuò)誤消息寫到里面去怒炸。示例代碼如下:
class MyForm(forms.ModelForm):
class Meta:
model = Article
exclude = ['category']
error_messages ={
'title':{
'max_length': '最多不能超過(guò)10個(gè)字符带饱!',
'min_length': '最少不能少于3個(gè)字符!'
},
'content': {
'required': '必須輸入content!',
}
}
save方法:
ModelForm
還有save
方法勺疼,可以在驗(yàn)證完成后直接調(diào)用save
方法教寂,就可以將這個(gè)數(shù)據(jù)保存到數(shù)據(jù)庫(kù)中了。示例代碼如下:
form = MyForm(request.POST)
if form.is_valid():
form.save()
return HttpResponse('succes')
else:
print(form.get_errors())
return HttpResponse('fail')
這個(gè)方法必須要在clean
沒(méi)有問(wèn)題后才能使用执庐,如果在clean
之前使用酪耕,會(huì)拋出異常。另外轨淌,我們?cè)谡{(diào)用save
方法的時(shí)候迂烁,如果傳入一個(gè)commit=False
,那么只會(huì)生成這個(gè)模型的對(duì)象递鹉,而不會(huì)把這個(gè)對(duì)象真正的插入到數(shù)據(jù)庫(kù)中盟步。比如表單上驗(yàn)證的字段沒(méi)有包含模型中所有的字段,這時(shí)候就可以先創(chuàng)建對(duì)象躏结,再根據(jù)填充其他字段却盘,把所有字段的值都補(bǔ)充完成后,再保存到數(shù)據(jù)庫(kù)中媳拴。示例代碼如下:
form = MyForm(request.POST)
if form.is_valid():
article = form.save(commit=False)
article.category = 'Python'
article.save()
return HttpResponse('succes')
else:
print(form.get_errors())
return HttpResponse('fail')
看文章不過(guò)癮黄橘?還有免費(fèi)的視頻教程,讓你學(xué)起來(lái)更輕松:https://www.zhiliaoketang.cn/course/detail/4.html