表單-modelform

 

ModelForm:

你們在寫表單的時候,會發現表單中的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指定一個列表,將須要的字段寫進去。好比只想驗證titlecontent,那麼可使用如下代碼實現: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!',
            }
        }

save方法:

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')
相關文章
相關標籤/搜索