美文网首页
5.3 django 表单 ModelForm

5.3 django 表单 ModelForm

作者: yungege | 来源:发表于2019-08-17 20:56 被阅读0次

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指定一个列表,将需要的字段写进去。比如只想验证titlecontent,那么可以使用以下代码实现:

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

相关文章

  • 5.3 django 表单 ModelForm

    ModelForm: 大家在写表单的时候,会发现表单中的Field和模型中的Field基本上是一模一样的,而且表单...

  • Django ModelForm and Form

    django表单系统中,所有的表单类都作为django.forms.Form的子类创建,包括ModelForm 关...

  • Django中form的详解

    Django中自带有forms模块,直接使用即可。例如: 第二种 继承ModelForm:根据model生成表单,...

  • Django实战项目-在Django中使用Ajax (4)

    Django实战项目-在Django中使用Ajax (4) 1.ModelForm ModelForm与之前见到的...

  • Forms#3

    ModelForm 以已创建的model为原型创建表单时可以继承forms.ModelForm大多数model的字...

  • Django - ModelForm

    Form,ModelForm继承关系: ModelForm:Model + Form => 验证 + 数据库操作 ...

  • Django - Creating forms from mod

    Django可以创建直接存入models的form, 叫做ModelForm 首先ArticleForm可以继承M...

  • REST framework serializers使用记录

    REST framework中的serializers与Django的Form和ModelForm类非常像。它提供...

  • Django表单(二)

    什么是django表单 django中的表单不是html中的那个表单,这里是指django有一个组件名叫表单 它可...

  • 1 flask简介

    python几大web框架区别 Django:大型框架,内部包括很多组件,ORM,Form,ModelForm,缓...

网友评论

      本文标题:5.3 django 表单 ModelForm

      本文链接:https://www.haomeiwen.com/subject/nkfqsctx.html