modelform的特点
modelform是django中基于已有的model,快速生成的具有form功能的一个模块,有以下几个特点:
1. 快速:只要告诉类对应哪个model,会根据model表中的字段,自动进行配置。不需要像form那样手动逐条定义每个字段
2. 灵活:可以只选择model表中部分的字段,使用feilds=[,]或者exclude=[,],或者"__all__"表示所有字段
3. 可以自定义添加字段
4. 可以自定义错误信息
5. 可以自定义参数(控制样式等)
6. 利用自带的组件进行字段校验
modelform的使用
1. 创建model表
# app01/models.py
from django.db import models
class UserInfo(models.Model):
"""
用户信息表
"""
user = models.CharField(verbose_name='用户名', max_length=32, db_index=True) # db_index表示为字段增加索引
password = models.CharField(verbose_name="密码", max_length=32)
email = models.EmailField(verbose_name='邮箱', max_length=64)
phone = models.CharField(verbose_name='手机号', max_length=16)
2. 基于model创建modelform
# app01/forms.py
from django import forms
from app01 import models
class RegisterModelForm(forms.ModelForm):
class Meta:
model = models.UserInfo # 基于的model表名
fields = '__all__' # 表示自动渲染所有字段
3. 通过视图函数将modelform实例化,并传递给前端
# app01/views.py
from django.shortcuts import render,
from app01.forms import RegisterModelForm
def register(request):
if request.method == 'GET':
form = RegisterModelForm() # 实例化modelform
return render(request, 'register.html', {'form': form}) # 将实例化对象传递给前端
4. 前端使用for循环快速渲染form表单
- form对象中的每个field代表每个字段的input框
- field.label对应的是model表中的verbose_name,如UserInfo表中user字段的verbose_name:'用户名'
- field.id_for_label 对应的是渲染中,为label标签链接input框指定的属性
- field.errors表示返回form表单验证的错误信息。注意: 错误信息返回的是元组,需要用field.errors.0
# register.html
...
<form id="regform" method="post" class="form-group" novalidate>
{% csrf_token %}
{% for field in form %} <!--field代表每个字段的input框-->
<div class="form-group">
<label class='control-label' for="{{ field.id_for_label }}">{{ field.label }}</label>
<div>
{{ field }}<span class="error-msg">{{ field.errors.0 }}</span>
</div>
</div>
{% endfor %}
<input id="btnsumbit" type="button" class="btn-primary btn" value="注 册">
</div>
</form>
...
5. 前端接收用户提交的post请求,进行校验和保存数据
- 通过 form = RegisterModelForm(data=request.POST) 接收用户提交的数据
- 通过 form.is_valid() 进行校验
- 通过 form.save() 保存数据
- 如果没通过校验,返回当前页面及当前的form对象,其包含错误信息
def register(request):
if request.method == 'GET':
form = RegisterModelForm()
return render(request, 'register.html', {'form': form})
# POST请求
form = RegisterModelForm(data=request.POST)
if form.is_valid():
user_obj = form.save()
return redirect(reverse('login'))
return render(request, "register.html", {'form': form}) # 包含错误信息
modelform自定义添加字段
在上面的简单注册form表单中,通常需要有给用户输入的确认密码的字段框,但是在用户表中又不需要这个字段,modelform其实支持自定义添加molde中没有的字段
# app01/forms.py
from django import forms
from app01 import models
class RegisterModelForm(forms.ModelForm):
# 自定义添加字段
confirm_password = forms.CharField(label='确认密码', widget=forms.PasswordInput)
class Meta:
model = models.UserInfo # 基于的model表名
fields = '__all__' # 表示自动渲染所有字段
modelform 自定义显示部分字段
- fields = '__all__' 表示自动渲染所有字段
- fields = [’user‘,’password‘,’email‘] 表示仅渲染列表中的字段
- exclude = [’phone‘] 表示排除列表中的字段,效果同上
# app01/forms.py
from django import forms
from app01 import models
class RegisterModelForm(forms.ModelForm):
class Meta:
model = models.UserInfo # 基于的model表名
fields = [’user‘,’password‘,’email‘] # 表示仅渲染列表中的字段
# exclude = [’phone‘] # 表示排除列表中的字段,效果同上
modelform 自定义错误信息
modelform有自动校验错误并返回错误信息的功能,如果不想用自带的错误信息的内容,可以利用modelform中的error_messages 属性进行自定义
class RegisterModelForm(forms.ModelForm):
class Meta:
...
error_messages = { # 自定义错误信息
'user':{
'required': ('角色名称不能为空'),
},
’字段名’:{
‘错误情况1’:(’错误信息1‘),
...
},
...
}
modelform 自定义参数(样式)
比如想要让password在输入框中以密文形式显示,则可以自定义参数
class RegisterModelForm(forms.ModelForm):
# 自定义添加字段参数(方式一)
confirm_password = forms.CharField(label='确认密码', widget=forms.PasswordInput)
class Meta:
...
widgets = { # 自定义标签参数(方式二)
'password': forms.PasswordInput(attrs={'class': 'form-control'})
}
至此,关于django中的modelform基本使用介绍完毕,另外关于modelform的其他一些常用方法,比如局部验证,未输入字段的保存等,后续会在单独的文章中介绍。
如文章中有错误,欢迎指正