五月天青色头像情侣网名,国产亚洲av片在线观看18女人,黑人巨茎大战俄罗斯美女,扒下她的小内裤打屁股

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

django ModelForm表單

2023-01-29 10:08 作者:app毒  | 我要投稿

ModelForm:

大家在寫表單的時(shí)候,會(huì)發(fā)現(xiàn)表單中的Field和模型中的Field基本上是一模一樣的,而且表單中需要驗(yàn)證的數(shù)據(jù),也就是我們模型中需要保存的。那么這時(shí)候我們就可以將模型中的字段和表單中的字段進(jìn)行綁定。
比如現(xiàn)在有個(gè)Article的模型。示例代碼如下:

from django.db import modelsfrom django.core import validatorsclass 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 formsclass MyForm(forms.ModelForm): ? ?class Meta: ? ? ? ?model = Article ? ? ? ?fields = "__all__"

MyForm是繼承自forms.ModelForm,然后在表單中定義了一個(gè)Meta類,在Meta類中指定了model=Article,以及fields="__all__",這樣就可以將Article模型中所有的字段都復(fù)制過來,進(jìn)行驗(yàn)證。如果只想針對(duì)其中幾個(gè)字段進(jìn)行驗(yàn)證,那么可以給fields指定一個(gè)列表,將需要的字段寫進(jìn)去。比如只想驗(yàn)證titlecontent,那么可以使用以下代碼實(shí)現(xiàn):

from django import formsclass MyForm(forms.ModelForm): ? ?class Meta: ? ? ? ?model = Article ? ? ? ?fields = ['title','content']

如果要驗(yàn)證的字段比較多,只是除了少數(shù)幾個(gè)字段不需要驗(yàn)證,那么可以使用exclude來代替fields。比如我不想驗(yàn)證category,那么示例代碼如下:

class MyForm(forms.ModelForm): ? ?class Meta: ? ? ? ?model = Article ? ? ? ?exclude = ['category']

自定義錯(cuò)誤消息:

使用ModelForm,因?yàn)樽侄味疾皇窃诒韱沃卸x的,而是在模型中定義的,因此一些錯(cuò)誤消息無法在字段中定義。那么這時(shí)候可以在Meta類中,定義error_messages,然后把相應(yīng)的錯(cuò)誤消息寫到里面去。示例代碼如下:

class MyForm(forms.ModelForm): ? ?class Meta: ? ? ? ?model = Article ? ? ? ?exclude = ['category'] ? ? ? ?error_messages ?={ ? ? ? ? ? ?'title':{ ? ? ? ? ? ? ? ?'max_length': '最多不能超過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沒有問題后才能使用,如果在clean之前使用,會(huì)拋出異常。另外,我們?cè)谡{(diào)用save方法的時(shí)候,如果傳入一個(gè)commit=False,那么只會(huì)生成這個(gè)模型的對(duì)象,而不會(huì)把這個(gè)對(duì)象真正的插入到數(shù)據(jù)庫(kù)中。比如表單上驗(yàn)證的字段沒有包含模型中所有的字段,這時(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')


django ModelForm表單的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
当阳市| 杨浦区| 龙川县| 饶阳县| 扶沟县| 衡水市| 昆明市| 霍山县| 通渭县| 恩施市| 广丰县| 吉木萨尔县| 新昌县| 亚东县| 香河县| 类乌齐县| 来宾市| 闵行区| 丰县| 曲周县| 聂荣县| 栾川县| 潞城市| 平塘县| 建宁县| 新蔡县| 永胜县| 安图县| 开鲁县| 垫江县| 崇礼县| 神农架林区| 定安县| 安平县| 四平市| 河池市| 左权县| 竹溪县| 靖安县| 彩票| 江山市|