小白IT:Django框架—form组件和ModelForm

一、form简介

我知道前端页面可以通过form表单向后端提交数据,需要用form表单将获取用户输入的标签包裹起来。

与此同时,很多场景,我们需要对用户的输入进行校验,如长度/格式合不合法,若不合法我们希望在相应的位置提示用户对应的错误信息。

如果我们通过js来实现上述效果,必然是可以的,但是过程很复杂,而Django中的form组件帮我们封装好了所有上述的功能,只需要调用一些接口就可以实现。

1.form组件的功能

form组件的功能

  1. 通过后端的form组件生成前端页面对应的HTML标签
  2. 对前端form页面提交的数据进行合法性校验,并作出相应提示
  3. 校验的之后可以保留前端页面输入内容,增加用户体验

2.form组件的简单使用

数据库模型准备

新建项目form_lesson下app01文件中的models.py

models.py

执行同步指令makemigrations和migrate同步到数据库,添加一些数据后表结构如下
在这里插入图片描述

form简单使用

使用form之前需要定义一个类,来继承forms.Form。

这里为了项目的整洁性,我们另起一个文件夹,命名utils,在里面写我们要定义的类

在这里插入图片描述

from django import forms

class LoginForm(forms.Form):
    # 按照form组件定义自己的类,需要继承forms.Form
    username = forms.CharField(
        label="用户名",
        min_length=8,
        error_messages={
   
            "required": "不能为空",
            "invalid": "格式错误",
            "min_length": "用户名最短8位"
        },
        widget=forms.widgets.TextInput(attrs={
   "class": "form-control"})
    )  # form字段名称是前端input标签的name属性。
    password = forms.CharField(
        label="密码",
        min_length=12,
        widget=forms.widgets.PasswordInput(attrs={
   "class": "form-control"})
    )
在视图函数中写注册函数
from django.shortcuts import render,HttpResponse,redirect
from utils.formlesson import LoginForm  # 导入自定义的RegFrom类

def login(request):
    form_obj = LoginForm()  # 实例化一个form对象
    if request.method=="POST":
        form_obj = LoginForm(data=request.POST)  # 将input标签的name属性值和form字段相同的数据进行form校验
        if form_obj.is_valid() and request.POST.get("username") == "alex" and request.POST.get("password") == "alex":  # 用is_valid方法判断提交的数据是否合法
            return HttpResponse("登录成功")
    return render(request,"login.html",{
   "form_obj":form_obj})  # 如果是get请求,返回页面,并且通过form对象在前端渲染获取html标签。
模板文件login.html文件
{
   % load static %}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <link href="{% static 'bootstrap-3.3.7-dist/css/bootstrap.min.css' %}" rel="stylesheet">
</head>
<body>
<div class="container">
    <div class="col-sm-6 col-sm-offset-3">
        <form action="{% url 'register' %}" method="post" novalidate>  <!--novalidate告诉浏览器,不需要对输入内容做校验,以便我们使用自己的校验提示-->
            {
   % csrf_token %}
            <!--第一种写法:直接生成,但是不利于个性化定制-->
            {
   {
    form_obj.as_p }}


            <!--第二种写法:更利于个性化的定制-->
            <div class="form-group">
                <label for="{
   { form_obj.username.id_for_label }}">{
   {
    form_obj.username.label }}</label>
                <!--获取input标签的idfor属性,获取label提示的名字-->
                {
   {
    form_obj.username }}  <!--获取form对象的字段name,生成name="name"input标签-->
                {
   {
    form_obj.username.errors.0 }}  <!--获取name字段校验后的错误提示-->
                {
   {
    form_obj.errors }}  <!--获取form标签全局的错误提示,里面统计了所有input标签的错误信息-->
            </div>

            <div class="form-group">
                <label for="{
   { form_obj.password.id_for_label }}">{
   {
    form_obj.password.label }}</label>
                {
   {
    form_obj.password }}
                {
   {
    form_obj.password.errors.0 }}
            </div>

            <!--第三种写法:通过for循环对象中的字段,写法更加简便-->
            {
   % for field in form_obj %}  <!--循环form对象中的所有字段,对每个字段生成相应的标签-->
                <div class="form-group">
                    <label for="{
   { field.id_for_label }}">{
   {
    field.label }}</label>
                    {
   {
    field }}
                    {
   {
    field.errors.0 }}
                </div>
            {
   % endfor %}
            <input type="submit">
        </form>
    </div>
    <div class="row">

        <script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.js"></script>
        <script src="{% static 'bootstrap-3.3.7-dist/js/bootstrap.min.js' %}"></script>
</body>
</html>

通过前端页面效果,验证了form组件的功能:

  1. 前端页面是form类的对象生成的 -->生成HTML标签功能
  2. 当用户名和密码输入为空或输错之后 页面都会提示 -->用户提交校验功能
  3. 当用户输错之后 再次输入 上次的内容还保留在input框 -->保留上次输入内容

二、Form中常用字段约束与插件

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

1.常用字段约束与对应插件

我们通过在formlesson中再定义一个注册form类来演示不同字段约束的标签效果。

通过forms.widgets.插件名(attrs={key,val})来为标签指定插件以及添加属性,添加的属性可以应用bootstrap中的样式类。

initial

initial是input标签输入框中的初始值

from django import forms  # 导入froms模块
class RegForm(forms.Form):
    username = forms.CharField(
        min_length=8,  # 用户名最小长度
        label="用户名",
        initial="张三",
        widget=forms.widgets.TextInput(attrs={
   "class":"form-control"})
    )
error_messages

自定义错误信息提示内容

class RegForm(forms.Form):
    username = forms.CharField(
        min_length=8,
        label="用户名",
        initial="张三",
        error_messages={
     # 自定义错误信息提示内容
            "required": "内容不能为空",  # 原本为
            "invalid": "格式错误",
            "min_length": "用户名最短8位"
        },
        widget=forms.widgets.TextInput(attrs={
   "class":"form-control"})  # 给input标签的添加插件,并添加属性bootstrap样式属性
    )

在这里插入图片描述

passw
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值