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

 

Django中的Form组件功能:

1.对用户请求的验证

2.生成html代码

Form使用:对用户请求进行验证

前端代码:

"/f1.html" method="post" id="fm">

"text" name="user">{ { obj.errors.user.0 }} #获取错误信息.0去掉换行

"password" name="pwd">{ { obj.errors.pwd.0 }}

"text" name="email">{ { obj.errors.email.0 }}

"text" name="age">{ { obj.errors.age.0 }}

{ % csrf_token %} "submit" value="提交">

服务端:

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})

 

客户端:

"/f1.html" method="post" id="fm">

{ { obj.user }}{ { obj.errors.user.0 }} #因为get请求中没有在form组件中传入值,所以不会产生相关错误信息,为空,不显示

{ { obj.pwd }}{ { obj.errors.pwd.0 }}

{ { obj.email }}{ { obj.errors.email.0 }}

{ { obj.age }}{ { obj.errors.age.0 }}

{ % csrf_token %} "submit" value="提交"> "button" value="ajax提交" οnclick="submitAjaxForm();">

 补充:在添加数据库时,保持前端name,form验证字段,models字段名一致,会便于数据添加:

前端:

      
"/add_user.html" method="post">

{ { obj.username }}{ { obj.errors.username }}

{ { obj.email }}{ { obj.errors.email }}

{ % csrf_token %} "submit" value="提交">

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后缀 )

前端使用:

{ { obj.field_test.label }}{ { obj.field_test }}{ { obj.field_test.email }}

注:可以使用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),)

 .......

转载于:https://www.cnblogs.com/ssyfj/p/8679520.html

你可能感兴趣的:(python,前端,数据库)