你們在寫表單的時候,會發現表單中的Field
和模型中的Field
基本上是如出一轍的,並且表單中須要驗證的數據,也就是咱們模型中須要保存的。那麼這時候咱們就能夠將模型中的字段和表單中的字段進行綁定。
好比如今有個Article的模型。示例代碼以下:javascript
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模型中全部的字段都一個個重複寫一遍了。示例代碼以下:html
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
,那麼可使用如下代碼實現:java
from django import forms class MyForm(forms.ModelForm): class Meta: model = Article fields = ['title','content']
若是要驗證的字段比較多,只是除了少數幾個字段不須要驗證,那麼可使用exclude
來代替fields
。好比我不想驗證category
,那麼示例代碼以下:python
class MyForm(forms.ModelForm): class Meta: model = Article exclude = ['category']
使用ModelForm
,由於字段都不是在表單中定義的,而是在模型中定義的,所以一些錯誤消息沒法在字段中定義。那麼這時候能夠在Meta類中,定義error_messages
,而後把相應的錯誤消息寫到裏面去。示例代碼以下:ios
class MyForm(forms.ModelForm): class Meta: model = Article exclude = ['category'] error_messages ={ 'title':{ 'max_length': '最多不能超過10個字符!', 'min_length': '最少不能少於3個字符!' }, 'content': { 'required': '必須輸入content!', } }
ModelForm
還有save
方法,能夠在驗證完成後直接調用save
方法,就能夠將這個數據保存到數據庫中了。示例代碼以下:web
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')