ModelForm:表單中的 Field 和模型中的 Field重複解決

ModelForm數據庫

你們在寫表單的時候,會發現表單中的 Field  和模型中的 Field  基本上是如出一轍的,並且表單中須要驗證的數據,也就是咱們模型中須要保存的。那麼這時候咱們就能夠將模型中的字段和表單中的字段進行綁定。django

好比如今有個 Article  的模型。示例代碼以下:ui

from django.db import modelsspa

from django.core import validatorsorm

class Article(models.Model):對象

  title = models.CharField(max_length=10,validators=[validators.MinLengthValidator(limit_value=3)])繼承

  content = models.TextField()get

  author = models.CharField(max_length=100)it

  category = models.CharField(max_length=100)form

  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')

相關文章
相關標籤/搜索