Django组件之Form表单

一、Django中的Form表单介绍
我们之前在HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来。

与此同时我们在好多场景下都需要对用户的输入做校验,比如校验用户是否输入,输入的长度和格式等正不正确。如果用户输入的内容有错误就需要在页面上相应的位置显示对应的错误信息.。

Django form组件就实现了上面所述的功能:
    生成页面可用的HTML标签
    对用户提交的数据进行校验
    保留上次输入内容



二、普通方式的form表单注册
1、views.py
def register(request):
    error_msg = ""
    if request.method == "POST":
        username = request.POST.get("username")
        pwd = request.POST.get("pwd")
        # 对注册信息做校验
        if len(username) < 6:
            # 用户长度小于6位
            error_msg = "用户名长度不能小于6位"
        else:
            # 将用户名和密码存到数据库
            UserInfo.objects.create(username='username', password='pwd')
            return redirect("/login/")
    return render(request, "register.html", {"error_msg": error_msg})


2、regirest.html
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta http-equiv="content-type" charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <title>注册页面</title>
</head>
<body>
<form action="/register/" method="post">
    {% csrf_token %}
    <p>
        <label for="t1"></label>用户名
        <input type="text" name="username" id="t1">
    </p>
    <p>
        <label for="p1"></label>密码
        <input type="password" name="pwd" id="p1">
    </p>
    <p>
        <input type="submit" value="注册">
        <p style="color: red">{{ error_msg }}</p>
    </p>
</form>
</body>
</html>



三、使用form组件实现注册功能
数据库
class UserInfo(models.Model):
    username = models.CharField(max_length=12)
    password = models.CharField(max_length=20)


1、views.py
1.先定义好一个RegForm类
from django import forms

# 按照Django form组件的要求自己写一个类
class RegForm(forms.Form):
    name = forms.CharField(max_length=12, label="用户名")
    pwd = forms.CharField(min_length=6, max_length=18, label="密码")


2.再写一个视图函数
# 使用form组件实现注册方式
def register(request):
    form_obj = RegForm()
    if request.method == "POST":
        # 实例化form对象的时候,把post提交过来的数据直接传进去
        form_obj = RegForm(request.POST)
        # 调用form_obj校验数据的方法is_valid
        if form_obj.is_valid():
            username = form_obj.cleaned_data.get('name')  # cleaned_data会自动把form提交的数据提取出来形成一个字典
            pwd = form_obj.cleaned_data.get('pwd')
            UserInfo.objects.create(username=username, password=pwd)
            return redirect("/login/")
        else:
            # 如果数据有问题
            return render(request, "register.html", {'form_obj': form_obj})
    return render(request, "register.html", {"form_obj": form_obj})


2、regirest.html
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta http-equiv="content-type" charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <title>注册页面</title>
<body>
    <form action="/register/" method="post" novalidate autocomplete="off">
        {% csrf_token %}
        <div>
            <label for="{{ form_obj.name.id_for_label }}">{{ form_obj.name.label }}</label>
            {{ form_obj.name }} <span>{{ form_obj.name.errors.0 }}</span>
        </div>
        <div>
            <label for="{{ form_obj.pwd.id_for_label }}">{{ form_obj.pwd.label }}</label>
            {{ form_obj.pwd }} <span>{{ form_obj.pwd.errors.0 }}</span>
        </div>
        <div>
            <input type="submit" class="btn btn-success" value="注册">
        </div>
    </form>
</body>
</html>


3、分析
form的功能:
前端页面是使用Django模板语言和form类的对象生成的                     -->生成HTML标签功能
当用户名和密码输入为空或输错form组件会默认为我们设置错误信息          -->用户提交校验功能
当用户输错之后仍保留着上次输入的内容在input框                        -->保留上次输入内容

简析:
{{ form_obj.name }} 自动生成一个input框,属性就是我们在views.py里面设置的form类的属性
{{ form_obj.name.id_for_label }} 关联自动生成的input框
{{ form_obj.name.label }}  form对象的name的label属性的值
{{ form_obj.name.errors.0 }}  错误信息


四、Form常用字段与插件
创建Form类时,主要涉及到 【字段】 和 【插件】,字段用于对用户请求数据的验证,插件用于自动生成HTML;


0、require
设置这个字段必须要填,默认也是True必填的

class LoginForm(forms.Form):
    username = forms.CharField(
        min_length=8,
        label="用户名",
        required=False  # 设置成不是必须要填
    )
    pwd = forms.CharField(min_length=6, label="密码")


1、initial
设置input框里面的初始值。

class LoginForm(forms.Form):
    username = forms.CharField(
        min_length=8,
        label="用户名",
        initial="张三"  # 设置默认值
    )
    pwd = forms.CharField(min_length=6, label="密码")


2、error_messages
1.局部重写错误信息,哪个字段需要重写错误信息就在哪个字段设置

class LoginForm(forms.Form):
    username = forms.CharField(
        min_length=8,
        label="用户名",
        initial="张三",
        error_messages={
            "required": "不能为空",
            "invalid": "格式错误",
            "min_length": "用户名最短8位"
        }
    )
    pwd = forms.CharField(min_length=6, label="密码")

2.设置全局错误信息(把默认的错误信息由英文改成中文)
在settings.py里面设置
# LANGUAGE_CODE = 'en-us'
LANGUAGE_CODE = 'zh-hans'  # 把语言改成中文(汉字)

# TIME_ZONE = 'UTC'
TIME_ZONE = 'Asia/Shanghai'  # 时区改成亚洲上海


3、widget
设置input框的type类型,默认类型是text,密码框的type应该设置为password
还可以设置input框的属性,比如class的样式

class LoginForm(forms.Form):
    ...
    pwd = forms.CharField(
        min_length=6,
        label="密码",
        # 把密码框设置为password类型,并指定class为c1和c2的样式类
        # 当出现出错时,其他类型的input框默认是保留你写的内容,只有密码框不会保存
        # 想要密码框错误时也保留内容,就设置render_value=True
        widget=forms.widgets.PasswordInput(attrs={'class': 'c1 c2'}, render_value=True)  
    )


4、radioSelect
选择框都是使用forms.fields.ChoiceField
也可以写成forms.ChoiceField

单选框radio,值为字符串

class LoginForm(forms.Form):
    username = forms.CharField(
        min_length=8,
        label="用户名",
        initial="张三",
        error_messages={
            "required": "不能为空",
            "invalid": "格式错误",
            "min_length": "用户名最短8位"
        }
    )
    pwd = forms.CharField(min_length=6, label="密码")
    gender = forms.fields.ChoiceField(
        choices=((1, ""), (2, ""), (3, "保密")),
        label="性别",
        initial=3,
        widget=forms.widgets.RadioSelect()
    )


5、单选Select

class LoginForm(forms.Form):
    ...
    hobby = forms.fields.ChoiceField(
        choices=((1, "篮球"), (2, "足球"), (3, "双色球"), ),
        label="爱好",
        initial=3,
        widget=forms.widgets.Select()
    )


6、多选Select

class LoginForm(forms.Form):
    ...
    hobby = forms.fields.MultipleChoiceField(
        choices=((1, "篮球"), (2, "足球"), (3, "双色球"), ),
        label="爱好",
        initial=[1, 3],
        widget=forms.widgets.SelectMultiple()
    )


7、单选checkbox

class LoginForm(forms.Form):
    ...
    keep = forms.fields.ChoiceField(
        label="是否记住密码",
        initial="checked",
        widget=forms.widgets.CheckboxInput()
    )


8、多选checkbox

class LoginForm(forms.Form):
    ...
    hobby = forms.fields.MultipleChoiceField(
        choices=((1, "篮球"), (2, "足球"), (3, "双色球"),),
        label="爱好",
        initial=[1, 3],
        widget=forms.widgets.CheckboxSelectMultiple()
    )

猜你喜欢

转载自www.cnblogs.com/Zzbj/p/9966753.html