modelform:根据模型字段定义相对应的表单字段
代码示例:
#forms.py
from django import forms
from django.core.exceptions import ValidationError
from django.contrib.auth.models import User
# modelForm
class LoginModelForm(forms.ModelForm):
class Meta:
# 1 定义模型 将模型表单类与某个模型绑定
model = User
# 2 定义验证字段,选取某些字段生成表单,__all__代表所有
fields = (
"username", "password",
)
# 3 labels 为每个字段设置label标签
labels = {
"username": "输入用户名",
"password": "请输入密码"
}
# 4 自定义错误信息,设置表单错误信息,"__all__" 所有字段错误信息,如果单个字段则可以如: error_messages = {
# "username": {"required": "请输入内容", "invalid": "请检查输入的内容"}
# }
error_messages = {
"__all__": {"required": "请输入内容", "invalid": "请检查输入的内容"}
}
# 5 定义widgets,设置表单字段对应html元素属性,dict形式
widgets = {
"username": forms.TextInput(
attrs={"class": "layui-input", "placeholder": "请输入", "lay-verify": "required|phone", "id": "username"}
),
"password": forms.PasswordInput(
attrs={"class": "layui-input", "placeholder": "请输入", "lay-verify": "required|password",
"id": "password"}
)
}
# 自定义数据清洗
def clean_username(self):
if len(self.cleaned_data['username']) == 11:
return self.cleaned_data['username']
else:
raise ValidationError("username is error")
#view.py
from django.forms import ModelForm
from django.contrib.auth.models import User
class LoginMView(View):
TEMPLATE = "login.html"
def get(self, request, *args, **kwargs):
title = "用户登录"
classContent = "logins"
infos = LoginModelForm()
return render(request, self.TEMPLATE, locals())
def post(self, request, *args, **kwargs):
title = "用户登录"
classContent = "logins"
infos = LoginModelForm(data=request.POST)
data = infos.data
username = data.get("username")
password = data.get("password")
if User.objects.filter(username=username):
user = authenticate(username=username, password=password)
if user:
login(request, user)
return redirect(reverse("shopper:shopper"))
else:
state = "注册成功"
d = dict(username=username, password=password, is_staff=1, is_active=1)
user = User.objects.create_user(**d)
user.save()
return render(request, self.TEMPLATE, locals())
属性:
instance:将模型查询的数据传入模型表单,作为表单的初始数据
model:必须属性用于绑定model对象
fields:可选属性,表示哪些模型字段可以转换为,默认为None代表所有的模型字段
exclude:与fields相反
labels:可选属性,设置html控件的label属性
widgets:可选属性,设置表单字段参数widget
localized_fields:可选属性,将模型字段设为本地化的表单字段,一般用于日期类型的模型字段
field_classes: 可选属性,将模型字段重新定义,默认情况下模型字段跟表达字段遵循django内置转化规则
help_texts:可选属性,设置表单字段的help_text
error_messages: 可选属性,设置表单字段的error_messages
方法:
clean(): 重写父类baseform的clean()方法,并将_validate_unique设置为True
validate_unique():验证表单数据是否存在异常
save():将模型表单数据保存在数据库里,如果参数commit为true就直接保存在数据库,否则生成数据实例对象。
模型字段和表单字段django内置转化规则:
AutoField:不能转化为表单字段
BigAutoField:不能转为表单字段
BigIntegerField IntegerField,最小-9223372036854775808,最大9223372036854775807.
BooleanField BooleanField
CharField CharField,同样的最大长度限制。如果model设置了null=True,Form将使用empty_value
CommaSeparatedIntegerField CharField
DateField DateField
DateTimeField DateTimeField
DecimalField DecimalField
EmailField EmailField
FileField FileField
FilePathField FilePathField
FloatField FloatField
ForeignKey ModelChoiceField
ImageField ImageField
IntegerField IntegerField
IPAddressField IPAddressField
GenericIPAddressField GenericIPAddressField
ManyToManyField ModelMultipleChoiceField
NullBooleanField NullBooleanField
PositiveIntegerField IntegerField
PositiveSmallIntegerField IntegerField
SlugField SlugField
SmallIntegerField IntegerField
TextField CharField,并带有widget=forms.Textarea参数
TimeField TimeField
URLField URLField