python---django中form组件(1)简单使用和字段了解
Django中的Form组件功能:
1.对用户请求的验证
2.生成html代码
Form使用:对用户请求进行验证
前端代码:
<form action="/f1.html" method="post" id="fm"> <p> <input type="text" name="user">{{ obj.errors.user.0 }} #获取错误信息.0去掉换行 </p> <p> <input type="password" name="pwd">{{ obj.errors.pwd.0 }} </p> <p> <input type="text" name="email">{{ obj.errors.email.0 }} </p> <p> <input type="text" name="age">{{ obj.errors.age.0 }} </p> {% csrf_token %} <input type="submit" value="提交"> </form>
服务端:
from django import forms from django.forms import fields class F1Form(forms.Form): #下面数据字段名,对于前端表单中name user = fields.CharField( max_length=18, min_length=6, required=True, error_messages={ 'required':"用户名不为空", 'min_length':"太短了", 'max_length':"太长了", } ) pwd = fields.CharField(required=True,min_length=32) age = fields.IntegerField( required=True, error_messages={ 'invalid':"不对" } ) email = fields.EmailField(required=True,min_length=6) def f1(req): if req.method == "GET": return render(req,"f1.html") else: #检测是否为空 #检测格式是否正确 obj = F1Form(req.POST) if obj.is_valid(): #验证成功 return HttpResponse("ok") else:return render(req,"f1.html",{"obj":obj})
2.生成html:指的是在客户端中和服务端表单中为了保证name和字段一致,将表单设置为字段(自动生成表单),就是生成html代码
服务端:
def f1(req): if req.method == "GET": obj = F1Form() return render(req,"f1.html",{"obj":obj})
客户端:
<form action="/f1.html" method="post" id="fm"> <p>{{ obj.user }}{{ obj.errors.user.0 }} #因为get请求中没有在form组件中传入值,所以不会产生相关错误信息,为空,不显示 </p> <p> {{ obj.pwd }}{{ obj.errors.pwd.0 }} </p> <p> {{ obj.email }}{{ obj.errors.email.0 }} </p> <p> {{ obj.age }}{{ obj.errors.age.0 }} </p> {% csrf_token %} <input type="submit" value="提交"> <input type="button" value="ajax提交" onclick="submitAjaxForm();"> </form>
补充:在添加数据库时,保持前端name,form验证字段,models字段名一致,会便于数据添加:
前端:
<form action="/add_user.html" method="post"> <p>{{ obj.username }}{{ obj.errors.username }}</p> <p>{{ obj.email }}{{ obj.errors.email }}</p> {% csrf_token %} <input type="submit" value="提交"> </form>
form组件:
class UserForm(Form): username = fields.CharField(max_length=32,required=True) email = fields.EmailField(required=True,min_length=10)
models添加数据:
if req.method == "POST": obj = UserForm(req.POST) #前端name和form字段一致时,可以直接传递req.POST if obj.is_valid(): User.objects.create(**obj.cleaned_data) #form字段和models字段一致时,可以直接将检验成功的数据传入 return redirect("add_user.html")
补充2:为form组件生成html代码是设置默认数据
def edit_user(req): data = models.user.objects.filter(id=req.GET.get("nid")).first() obj = UserForm({"username":data.username,"email":data.email} return render("edit_user.html",{"obj":obj}) #会在obj中添加上默认数据
form组件字段介绍:
CharField字段介绍:
field_test = fields.CharField( required=True, max_length=32, min_length=16, error_messages={ 'required':"必须填写" }, #widget = widgets.Select(choices=[(1,'aa'),(2,'dd'),]),#定制html插件,就是将该字段设置为select表单格式 label="用户名", # initial="ccc", #只能对text格式设置,对于select等有其他方法 help_text="fawf", #帮助文本 show_hidden_initial=True, #隐藏框 validators=[],#自定义验证规则 disabled=True, #设置不可编辑
localize = True, #设置支持本地化
label_suffix="fawf", #设置label后缀 )
前端使用:
<p>{{ obj.field_test.label }}{{ obj.field_test }}{{ obj.field_test.email }}</p>
注:可以使用obj.as_p,as_table,as_ul将表单一次输出(方便,但是灵活性小了,自定义样式不方便,不推荐)
{{ obj.as_p }}
补充:文件上传验证:
FileField
form组件:
file = fields.FileField(required=True)
前端:
注意上传文件需要enctype = "mulipart/form-data" {{ obj.file }}
服务端:
obj = TestForm(req.POST,req.FILES) #含文件上传时需要将文件传入
ChoiceField:下拉框
city = fields.ChoiceField( choices = [(1,"aa"),(2,"bb"),(3,"cc"),],
initial = 2, #默认第二项 )
默认设置:
TestForm({"city":3}) #默认第三个选中
MultipleChoiceField()多选下拉框
initial=[1,2,]设置默认值多个
TypedChoiceField()继承于ChioceField()可以对接受的数据进行类型转换
coerce = lambda x: int(x)将字符串转整型
ComboField()组合验证规则进行验证
fields.COmboField(fields.CharField(max_length=30),fields.EmailField(required=True),)