Django Form组件

267 阅读5分钟

Django Form组件

主要功能

  • 自动生成HTML表单元素,可以减少前端的代码编写。
  • 通过表单字段类型、属性的定义,自动校验数据的合法性。
  • 如果验证错误,将重新显示表单,已输入的数据不会被重置或清空,用户界面友好。

步骤

  • 编写Django Form类
  • 建立URL与视图函数对应关系
  • 在视图函数中实例化DjangoForm类
  • 视图函数向模板文件发送Django Form实例化对象变量
  • 模板文件以一定形式显示Django Form实例化对象中存储的信息

编写Django Form类

Django Form对象一般用一个名为forms.py文件集中存放

在应用文件夹下创建forms.py文件

我的应用名为 fromtest

from django import forms
class test(forms.Form):
    username=forms.CharField(label="用户名")
    password=forms.CharField(label="密码")

lable 是在网页中显示的字段名

创建url

from django.contrib import admin
from django.urls import path

from fromtest.views import testform

urlpatterns = [
    path('admin/', admin.site.urls),
    path('testform/',testform)
]

编写视图函数

from django.shortcuts import render
from django.http import HttpResponse

from . import forms
# Create your views here.

def testform(request):
    if request.method == "POST":
        # 通过request.POST给form对象赋值
        test_forms=forms.test(request.POST)
        # 表单验证 判断数据的有效性
        #判断数据的有效性是依据Form类中的字段类型和对字段的有效性约束
        #有效性约束是通过字段属性来实现的
        if test_forms.is_valid():
            # 取值
            username=test_forms.cleaned_data.get('username')
            password=test_forms.cleaned_data.get('password')
            if (username==password and username!=None):
                return HttpResponse('登录成功')
            else:
                return HttpResponse('用户名或密码错误')
        else:
            return HttpResponse('数据不合法')
    # 初始化一个form对象
    test_forms=forms.test()
    return render(request,'testform.html',{'testform':test_forms})

form.is_valid()返回true后

表单数据被存储在form.cleaned_data中

这个属性是字典类型,字典的键名就是Form中定义的字段名

字典键值是提交的数据,因此可以通过get()函数取得表单数据

模板代码、

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Form测试</title>
</head>
<body>
<div align="center">
    <h1>测试</h1>
<form action="/testform/" method="post">
    {% csrf_token %}
    {{ testform.as_p }}
    <div><input type="submit" value="登录"></div>
</form>
</div>
</body>
</html>
{% csrf_token%}用来防御CSRF攻击。
{{ testform.as_table }}以表格的形式显示表单数据,将字段放在<tr>标签中
{{ testform.as_ul }}以<ul>标签样式显示,将字段放在<li>标签中
{{ testform.as_p }}将字段放在<p>标签中

测试

image-20211208161044362

image-20211208161055780

image-20211208161116140

image-20211208161207411

Form 字段

例子:

    telephone = forms.CharField(
        label='电话',
        min_length=11,
        error_messages={
            'required':'内容不能为空',
            'invalid':'格式错误',
            'min_length':'最少11位'
        }
    )

通用属性

  • label 生成HTML文件中的label标签
  • label_suffix label内容后缀 默认为 “:”
  • inital 字段初始值
  • help_text 字段描述信息
  • error_messages 指定错误信息
  • required 指定字段值是否可为空
  • disabled 指定字段是否可编辑
  • widget 指定字段的HTML标签形式

如果不指定widget Django会根据字段的类型指定默认标签

如果指定了widget,就会按照widget指定的类型在HTML网页中生成对应的标签

widget=forms.widgets.PasswordInput(attrs={'class':'password'},rv=True)

通过widget指定字段的输入框类型为密码输入型

通过attrs传递一个字典值以设置 input 标签的各种属性

render_value=True表示输入框校验不通过时,保留当前输入值

widget=forms.widgets.RadioSelect()
生成type="radio"的<input>标签。
widget=forms.widgets.Select()
生成<select>标签。
widget=forms.widgets.SelectMultiple()
生成可多选的<select>标签。
widget=forms.widgets.CheckboxInput()
生成type="checkbox"的<input>标签。

特有属性

ChaField字段

  • min_length指定字段最小长度
  • max_length指定最大长度
  • strip指定是否清除用户输入的空白

ChoiceField字段

  • choices限定字段值的可选项,用元组类型设置该属性,如choices = ((0,'男'),(1,'女'),)

File Field字段

  • allow_empty_file设置上传文件是否允许为空文件,是Boolean类型属性

值类型字段主要包括IntegerField、DecimalField、FloatField等类型字段

  • max_value指定字段的最大值
  • min_value指定字段的最小值
  • max_digits指定字段的总长度,是Decimal Field类型独有的属性
  • decimal_places指定字段的小数位长度,Decimal Field类型独有

常用字段

CharField

telephone = forms.CharField(
    label='电话',
    min_length=11,
    error_messages={
        'required':'内容不能为空',
        'invalid':'格式错误',
        'min_length':'最少11位'
    }
)

数值类型字段

IntegerField、FloatField、DecimalField

a=forms.IntegetField(max_value=100,min_value=10)
b=forms.FloatField(max_value=99.9,min_value=5.5)
c=forms.DecimalField(max_value=1050.25,min_value=100.5,max_digits=7, decimal_places=2)

日期时间字段

date=forms.DateField()
time=forms.TimeField()
datetime=forms.DateTimeField()
#DateField 为yyyy-mm-dd形式,如 2021-12-12
#TimeField 为hh:mm形式,如 22:00
#DateTimeField 为yyyy-mm-dd hh:mm形式 如 2021-12-12 22:00

Choice Field字段

如果不指定widget,默认在页面上生成<select>标签
sex = forms.ChoiceField(choices=((1, '男'), (2, '女'),),initial=1)

EmailField字段

url = forms.EmailField(label='邮箱', required=False)

Django ModelForm组件

可以直接将模型字段传递给模板,并将其渲染成需要的页面操作功能,省掉了Form类对表单字段的定义过程。

常用属性
model指定模型对象
fields指定表单的字段
__all__ 使用模型中的所有字段
['no','name','sex','address']指定字段
不指定 模板会使用表单变量传递的所有字段
exclude排除字段exclude=['no']
labels设置网页上显示的字段名
widgets设置表单字段的widget参数值
help_texts设置表单字段的help_text参数值
localized_fields指定模型字段设置为本地化格式的表单字段
field_classes自定义表单实例化的字段类型
error_messages指定表单字段的error_messages参数

forms.py文件

from django import forms
from fromtest import models

class ModelForm1(ModelForm):
    # 添加模型外的字段
    test = forms.CharField(label='测试')
    class Meta:
        #指定模型
        model=models.students
        # fields='__all__' 使用模型中的所有字段
        fields=['no','name','sex','address']
        labels={'no':'学号','name':'姓名','sex':'性别','address':'地址'}
        error_messages={
            'name':{'required':'姓名不能为空'}
        }
        help_texts={
            'name': '*必填'
        }

models.py 为

from django.db import models

# Create your models here.

class students(models.Model):
    no=models.CharField('学号',max_length=8,unique=True,primary_key=True)
    name=models.CharField('姓名',max_length=12)
    sex=models.CharField('性别',max_length=2)
    address=models.CharField('地址',max_length=40)

views.py

from django.shortcuts import render
from django.http import HttpResponse

from . import forms
# Create your views here.

def testform(request):
    if request.method == "POST":
        test_forms=forms.ModelForm1(request.POST)
        if test_forms.is_valid():
            no=test_forms.data.get('no')
            print('学号:',no)
            name = test_forms.data.get('name')
            print('姓名:', name)
            sex = test_forms.data.get('sex')
            print('性别:', sex)
            address = test_forms.data.get('address')
            print('地址:', address)
            test = test_forms.data.get('test')
            print('测试:', test)
            return HttpResponse('测试成功')
        else:
            return HttpResponse('数据不合法')
    test_forms=forms.ModelForm1(instance=None)
    return render(request,'testform.html',{'testform':test_forms})

模板代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Form测试</title>
</head>
<body>
<div align="center">
    <h1>测试</h1>
<form action="/testform/" method="post">
    {% csrf_token %}
    {{ testform.as_p }}
    <div><input type="submit" value="添加"></div>
</form>
</div>
</body>
</html>

image-20211211162756012

点击添加按钮后 后台获取数据(只演示后台获取数据 未实现添加数据功能)

image-20211211162842412