Form组件
基础定义Form类
from django import forms
class UserModelForm(forms.ModelForm):
class Meta:
model = models.UserInfo
fields = ["name", "password",]
# fields = "__all__"
form = UserModelForm()
浏览器页面显示字段优先级:
- 建表的字段顺序
- 自定义字段的顺序
- 改变顺序-设定【fields】
自定义样式
widget
widget是字段的一个内在属性,用于定义字段在浏览器的页面里以何种插件(HTML元素)展现。
Widget.attrs参数
给插件添加样式或者属性
原有字段
class UserModelForm(forms.ModelForm):
class Meta:
model = models.UserInfo
fields = ["name", "password",]
widgets = {
"name": forms.TextInput(attrs={"class": "form-control"}),
"password": forms.PasswordInput(attrs={"class": "form-control"}),
"age": forms.TextInput(attrs={"class": "form-control"}),
}
新定义字段
class UserModelForm(forms.ModelForm):
name = forms.CharField(
min_length=3,
label="用户名",
widget=forms.TextInput(attrs={"class": "form-control"})
)
class Meta:
model = models.UserInfo
fields = ["name", "password", "age"]
批量修改样式
class Bootstrap:
bootstrap_class_exclude = []
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
# 循环ModelForm中的所有字段,给每个字段的插件设置
for name, field in self.fields.items():
if name in self.bootstrap_class_exclude:
continue
# 字段中有属性,保留原来的属性,没有属性,才增加。
if field.widget.attrs:
field.widget.attrs["class"] = "form-control"
field.widget.attrs["placeholder"] = "请输入{}".format(field.label)
else:
field.widget.attrs = {
"class": "form-control",
"placeholder": "请输入{}".format(field.label)
}
class BootstrapModelForm(Bootstrap, forms.ModelForm):
pass
class BootstrapForm(Bootstrap, forms.Form):
pass
校验
自定义字段校验
如何知道有哪些默认参数
进ChoiceField源码里找__init__
找到父类的super().__init__(*args, **kwargs)
即可看到默认参数
validators校验手机号
from django.core.validators import RegexValidator
mobile_phone = forms.CharField(
label="手机号",
validators=[RegexValidator(r'^1[3-9]\d{9}$', '手机号格式错误')]
)
限制长度、自定义报错信息
class RegisterModelForm(BootstrapModelForm):
password = forms.CharField(
label="密码",
widget=forms.PasswordInput(render_value=True),
min_length=8,
max_length=64,
error_messages={
"min_length": "密码长度不能小于8个字符",
"max_length": "密码长度不能大于64个字符",
}
)
required不能为空
required=true表示前端必须传参数,是默认值,可以不写。
required=false表示前端不传参数的时候,会将参数置为null。因此假如参数是int这种不能赋值为null的类型,就可能会报错。
http://localhost:8088/userInfo?id=
username = forms.CharField(
label="邮箱或手机号",
widget=forms.TextInput(),
required=True,
)
render_value保留数据(不使用ajax)
render_value=True指数据提交时会刷新页面的时候保留数据在表单里
password = forms.CharField(
label="密码",
widget=forms.PasswordInput(render_value=True),
required=True,
)
initial(不使用ajax)
一般用于提交数据需要刷新页面时在表单里提供默认值
钩子方法校验
方法名
def clean_[字段名](self):
获取值
变量名 = self.cleaned_data["字段名"]
自定义报错信息
from django.core.validators import ValidationError
raise ValidationError("手机号已存在")
request的数据传入Form中
def __init__(self, request, *args, **kwargs):
super().__init__(*args, **kwargs)
self.request = request
实例Form对象前后的参数与函数(视图函数处)
instance
传入的是某一行的数据库对象,通常用于编辑界面展示原有数据,以及编辑数据时保存数据确定的保存的数据对象
form = ModelForm(instance=row_object)
data
传入的是前端传过来的数据,一般是(request.POST),用于后端存储数据
添加指定字段错误
form.add_error("字段名","报错信息")
校验完成后的增删数据
表单对象的某一列添加修改内容再写入数据库
常常用在Form中没有将表中的所有字段生成输出框传入前端,而这些数据是需要自己手动生成的默认值
form.instance.xxxx = xxx
if form.is_valid():
form.instance.project = request.tracer.project
form.instance.file_type = 2
form.instance.update_user = request.tracer.user
form.instance.parent = parent_object
form.save()
表单对象的某一列添加删除内容再写入数据库
常常用户获取到某个筛选条件来划分需要将数据存储到不同的表
data_dict = form.cleaned_data
xxx = data_dict.pop('xxx')