最淺顯易懂的Django系列教程(36)-ModelForm

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)證titlecontent阎抒,那么可以使用以下代碼實(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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末屈溉,一起剝皮案震驚了整個(gè)濱河市塞关,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌语婴,老刑警劉巖描孟,帶你破解...
    沈念sama閱讀 217,185評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異砰左,居然都是意外死亡匿醒,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門缠导,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)廉羔,“玉大人,你說(shuō)我怎么就攤上這事僻造”锼” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 163,524評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵髓削,是天一觀的道長(zhǎng)竹挡。 經(jīng)常有香客問(wèn)我,道長(zhǎng)立膛,這世上最難降的妖魔是什么揪罕? 我笑而不...
    開(kāi)封第一講書人閱讀 58,339評(píng)論 1 293
  • 正文 為了忘掉前任梯码,我火速辦了婚禮,結(jié)果婚禮上好啰,老公的妹妹穿的比我還像新娘轩娶。我一直安慰自己,他們只是感情好框往,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,387評(píng)論 6 391
  • 文/花漫 我一把揭開(kāi)白布鳄抒。 她就那樣靜靜地躺著,像睡著了一般椰弊。 火紅的嫁衣襯著肌膚如雪许溅。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 51,287評(píng)論 1 301
  • 那天男应,我揣著相機(jī)與錄音闹司,去河邊找鬼娱仔。 笑死沐飘,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的牲迫。 我是一名探鬼主播耐朴,決...
    沈念sama閱讀 40,130評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼盹憎!你這毒婦竟也來(lái)了筛峭?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 38,985評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤陪每,失蹤者是張志新(化名)和其女友劉穎影晓,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體檩禾,經(jīng)...
    沈念sama閱讀 45,420評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡挂签,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,617評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了盼产。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片饵婆。...
    茶點(diǎn)故事閱讀 39,779評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖戏售,靈堂內(nèi)的尸體忽然破棺而出侨核,到底是詐尸還是另有隱情,我是刑警寧澤灌灾,帶...
    沈念sama閱讀 35,477評(píng)論 5 345
  • 正文 年R本政府宣布搓译,位于F島的核電站,受9級(jí)特大地震影響锋喜,放射性物質(zhì)發(fā)生泄漏些己。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,088評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望轴总。 院中可真熱鬧直颅,春花似錦、人聲如沸怀樟。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,716評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)往堡。三九已至械荷,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間虑灰,已是汗流浹背吨瞎。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,857評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留穆咐,地道東北人颤诀。 一個(gè)月前我還...
    沈念sama閱讀 47,876評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像对湃,于是被迫代替她去往敵國(guó)和親崖叫。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,700評(píng)論 2 354