PHP前端开发

Django中ModelForm组件的介绍(代码示例)

百变鹏仔 1个月前 (01-23) #Python
文章标签 示例

本篇文章给大家带来的内容是关于Django中ModelForm组件的介绍(代码示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

通常在Django项目中,我们编写的大部分都是与Django 的模型紧密映射的表单。 举个例子,你也许会有个Book 模型,并且你还想创建一个form表单用来添加和编辑书籍信息到这个模型中。 在这种情况下,在form表单中定义字段将是冗余的,因为我们已经在模型中定义了那些字段。

基于这个原因,Django 提供一个辅助类来让我们可以从Django 的模型创建Form,这就是ModelForm。

modelForm定义

form与model的结合。

from django import formsfrom crm import modelsclass RegForm(forms.ModelForm):    password = forms.CharField(        widget=forms.PasswordInput,        label='密码',        min_length=6,        max_length=12    )    re_password = forms.CharField(        widget=forms.PasswordInput,        label='确认密码',        min_length=6,        max_length=12    )    mobile = forms.CharField(    )    class Meta:        model = models.UserProfile  # 指定model        fields = '__all__'  # 全部字段        # fields = ['username','password']  # 指定字段        exclude = ['is_active']  # 除某个字段之外的其余字段        labels = {            'username':'用户名'        }        error_messages = {            'min_length': '太短了',        }        widgets = {            'username': forms.TextInput(attrs={'placeholder': '用户名@xx.com'}),        }

class Meta下常用参数:

model = models.Book  # 对应的Model中的类fields = "__all__"  # 字段,如果是__all__,就是表示列出所有的字段exclude = None  # 排除的字段labels = None  # 提示信息help_texts = None  # 帮助提示信息widgets = None  # 自定义插件error_messages = None  # 自定义错误信息

ModelForm的验证

与普通的Form表单验证类型类似,ModelForm表单的验证在调用is_valid() 或访问errors 属性时隐式调用。

我们可以像使用Form类一样自定义局部钩子方法和全局钩子方法来实现自定义的校验规则。

如果我们不重写具体字段并设置validators属性的化,ModelForm是按照模型中字段的validators来校验的。

save()方法

每个ModelForm还具有一个save()方法。 这个方法根据表单绑定的数据创建并保存数据库对象。 ModelForm的子类可以接受现有的模型实例作为关键字参数instance;如果提供此功能,则save()将更新该实例。 如果没有提供,save() 将创建模型的一个新实例:

>>> from myapp.models import Book>>> from myapp.forms import BookForm# 根据POST数据创建一个新的form对象>>> form_obj = BookForm(request.POST)# 创建书籍对象>>> new_ book = form_obj.save()# 基于一个书籍对象创建form对象>>> edit_obj = Book.objects.get(id=1)# 使用POST提交的数据更新书籍对象>>> form_obj = BookForm(request.POST, instance=edit_obj)>>> form_obj.save()