
## ModelForm
大家在寫表單的時候,會發現表單中的Field和模型中的Field基本上是一模一樣的,而且表單中需要驗證的數據,也就是我們模型中需要保存的。那么這時候我們就可以將模型中的字段和表單中的字段進行綁定。
比如現在有個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)
```
那么在寫表單的時候,就不需要把Article模型中所有的字段都一個個重復寫一遍了。
```
from django import forms
class MyForm(forms.ModelForm):
class Meta:
model = Article
fields = "__all__"
```
MyForm是繼承自forms.ModelForm,然后在表單中定義了一個Meta類,在Meta類中指定了model=Article,以及fields="__all__",這樣就可以將Article模型中所有的字段都復制過來,進行驗證。如果只想針對其中幾個字段進行驗證,那么可以給fields指定一個列表,將需要的字段寫進去。比如只想驗證title和content,那么可以使用以下代碼實現
```
from django import forms
class MyForm(forms.ModelForm):
class Meta:
model = Article
fields = ['title','content']
```
如果要驗證的字段比較多,只是除了少數幾個字段不需要驗證,那么可以使用exclude來代替fields。比如我不想驗證category,那么示例代碼如下:
```
class MyForm(forms.ModelForm):
class Meta:
model = Article
exclude = ['category']
```
### 自定義錯誤消息
使用ModelForm,因為字段都不是在表單中定義的,而是在模型中定義的,因此一些錯誤消息無法在字段中定義。那么這時候可以在Meta類中,定義error_messages,然后把相應的錯誤消息寫到里面去。
```
class MyForm(forms.ModelForm):
class Meta:
model = Article
exclude = ['category']
error_messages ={
'title':{
'max_length': '最多不能超過10個字符!',
'min_length': '最少不能少于3個字符!'
},
'content': {
'required': '必須輸入content!',
}
}
```
### save方法
ModelForm還有save方法,可以在驗證完成后直接調用save方法,就可以將這個數據保存到數據庫中了
```
form = MyForm(request.POST)
if form.is_valid():
form.save()
return HttpResponse('succes')
else:
print(form.get_errors())
return HttpResponse('fail')
```
這個方法必須要在clean沒有問題后才能使用,如果在clean之前使用,會拋出異常。另外,我們在調用save方法的時候,如果傳入一個commit=False,那么只會生成這個模型的對象,而不會把這個對象真正的插入到數據庫中。比如表單上驗證的字段沒有包含模型中所有的字段,這時候就可以先創建對象,再根據填充其他字段,把所有字段的值都補充完成后,再保存到數據庫中。
```
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')
```
- 空白目錄
- 1-Django前導知識
- 1-1-虛擬環境
- 1-2-Django框架介紹與環境搭建
- 2-URL與視圖
- 2-1-URL與視圖
- 3-模板
- 3-1-模板介紹
- 3-2-模板變量
- 3-3-常用標簽
- 3-4-模板常用過濾器
- 3-5-模板結構優化
- 3-6-加載靜態文件
- 4-數據庫
- 4-1-操作數據庫
- 4-2-圖書管理系統
- 4-3-ORM模型介紹
- 4-4-ORM模型的增刪改查
- 4-5-模型常用屬性
- 4-6-外鍵和表
- 4-7-查詢操作
- 4-8-QuerySet的方法
- 4-9-ORM模型練習
- 4-10-ORM模型遷移
- 5-視圖高級
- 1-Django限制請求method
- 2-頁面重定向
- 3-HttpRequest對象
- 4-HttpResponse對象
- 5-類視圖
- 6-錯誤處理
- 6-表單
- 1-用表單驗證數據
- 2-ModelForm
- 3-文件上傳
- 7-session和cookie
- 1-session和cookie
- 8-memcached
- 1-memcached
- 9-阿里云部署
- 阿里云部署