因为我们后端要验证前段传过来的东西,不能只是前段进行验证
使用方法 1 写一个form.py文件
里面就是写对一个表的规则,比如用户登录的规则,对用户名密码的长度进行判断
from django.forms import Form
from django.forms import fields
# 定义登录的规则
class LoginForm(Form):
username = fields.CharField(max_length=20,min_length=2,required=True)
password = fields.CharField(max_length=20,min_length=2,required=True)
2 在登录的view里面的逻辑里面进行验证
def text(request):
obj = LoginForm(request.POST)
ret = obj.is_valid() # 进行验证,返回true 和 false
data = obj.cleaned_data # 将前段传过来的东西变成一个字典
if ret:
print(ret)
data = {
"code": 200,
"msg": data
}
return JsonResponse(data)
else:
print(obj.errors)
data = {
"code": 400,
"msg": obj.errors # 错误信息
}
return JsonResponse(data)
返回的错误信息是django自己的信息,我们想自定义错误信息
# 定义登录的规则
class LoginForm(Form):
username = fields.CharField(
max_length=5,
min_length=2,
required=True,
error_messages={
'required':'用户不能为空',
'min_length':'最小长度是2',
'max_length':'最大长度是5'
})
password = fields.CharField(max_length=20,min_length=2,required=True)
error_messages属性是键值对的形式,键是和其他属性一样,值就是自定义的错误信息
前端ajax进行接收
1 比如要验证前端传过来的是不是数字
2 验证邮箱
fields.RegexField('139\d+',error_messages={
'invalid':'格式错误'
})
根据后台定义的这些,可以动态的生成html的标签,就是根据这些属性,进行动态的生成html标签
label=None, 用于生成Label标签或显示内容
就是在后端的form文件里面的某一个字段,里面有这个属性,那么将这个对象返回给前端,就可以直接显示,获取的方法是
动态的生成标签
label_suffix=None Label内容后缀
help_text=‘’, 帮助信息(在标签旁边显示)
initial=None, 初始值
form 里面有多个字段,那么只要页面写这个as_p,那么就可以遍历多个字段进行展示了;
disabled=False, 是否可以编辑
widget=None, HTML插件
给页面渲染标签,到底是渲染input框,还是text框,还是下拉框,还是其他的,默认渲染input框;
我们在自定义admin后台的新增页面,或者修改页面的时候,就可以根据这个属性进行自定义标签形式;
from django.forms import Form
from django.forms import widgets
from django.forms import fields
from django.core.validators import RegexValidator
class MyForm(Form):
user = fields.ChoiceField(
# choices=((1, '上海'), (2, '北京'),),
initial=2,
widget=widgets.Select
)
def __init__(self, *args, **kwargs):
super(MyForm,self).__init__(*args, **kwargs)
# self.fields['user'].widget.choices = ((1, '上海'), (2, '北京'),)
# 或
self.fields['user'].widget.choices = models.Classes.objects.all().value_list('id','caption')
使用django提供的ModelChoiceField和ModelMultipleChoiceField字段来实现
from django import forms
from django.forms import fields
from django.forms import widgets
from django.forms import models as form_model
from django.core.exceptions import ValidationError
from django.core.validators import RegexValidator
class FInfo(forms.Form):
authors = form_model.ModelMultipleChoiceField(queryset=models.NNewType.objects.all())
# authors = form_model.ModelChoiceField(queryset=models.NNewType.objects.all())
# 单radio,值为字符串
# user = fields.CharField(
# initial=2,
# widget=widgets.RadioSelect(choices=((1,'上海'),(2,'北京'),))
# )
# 单radio,值为字符串
# user = fields.ChoiceField(
# choices=((1, '上海'), (2, '北京'),),
# initial=2,
# widget=widgets.RadioSelect
# )
# 单select,值为字符串
# user = fields.CharField(
# initial=2,
# widget=widgets.Select(choices=((1,'上海'),(2,'北京'),))
# )
# 单select,值为字符串
# user = fields.ChoiceField(
# choices=((1, '上海'), (2, '北京'),),
# initial=2,
# widget=widgets.Select
# )
# 多选select,值为列表
# user = fields.MultipleChoiceField(
# choices=((1,'上海'),(2,'北京'),),
# initial=[1,],
# widget=widgets.SelectMultiple
# )
# 单checkbox
# user = fields.CharField(
# widget=widgets.CheckboxInput()
# )
# 多选checkbox,值为列表
# user = fields.MultipleChoiceField(
# initial=[2, ],
# choices=((1, '上海'), (2, '北京'),),
# widget=widgets.CheckboxSelectMultiple
# )
TextInput(Input)
NumberInput(TextInput)
EmailInput(TextInput)
URLInput(TextInput)
PasswordInput(TextInput)
HiddenInput(TextInput)
Textarea(Widget)
DateInput(DateTimeBaseInput)
DateTimeInput(DateTimeBaseInput)
TimeInput(DateTimeBaseInput)
CheckboxInput
Select
NullBooleanSelect
SelectMultiple
RadioSelect
CheckboxSelectMultiple
FileInput
ClearableFileInput
MultipleHiddenInput
SplitDateTimeWidget
SplitHiddenDateTimeWidget
SelectDateWidget
页面上渲染生成的标签,只能输入数字