python---django中form组件(1)简单使用和字段了解

时间:2022-03-30 22:13:08

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. }}
</p>
<p>
<input type="text" name="email">{{ obj.errors.email. }}
</p>
<p>
<input type="text" name="age">{{ obj.errors.age. }}
</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=,
min_length=,
required=True,
error_messages={
'required':"用户名不为空",
'min_length':"太短了",
'max_length':"太长了",
}
)
pwd = fields.CharField(required=True,min_length=)
age = fields.IntegerField(
required=True,
error_messages={
'invalid':"不对"
}
)
email = fields.EmailField(required=True,min_length=) 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. }} #因为get请求中没有在form组件中传入值,所以不会产生相关错误信息,为空,不显示
</p>
<p>
{{ obj.pwd }}{{ obj.errors.pwd. }}
</p>
<p>
{{ obj.email }}{{ obj.errors.email. }}
</p>
<p>
{{ obj.age }}{{ obj.errors.age. }}
</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=,required=True)
email = fields.EmailField(required=True,min_length=)

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=,
min_length=,
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 = [(,"aa"),(,"bb"),(3,"cc"),],
     initial = 2, #默认第二项
) 默认设置:
TestForm({"city":3}) #默认第三个选中

MultipleChoiceField()多选下拉框

initial=[,,]设置默认值多个

TypedChoiceField()继承于ChioceField()可以对接受的数据进行类型转换

coerce = lambda x: int(x)将字符串转整型

ComboField()组合验证规则进行验证

fields.COmboField(fields.CharField(max_length=),fields.EmailField(required=True),)

.......