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

相关文章
相关标签/搜索