django -- form(二)

简介: django -- form

ModelForm


在上面我们使用form来验证了字段,假如我们注册的时候,数据表里的每个字段都要显示在页面上,难道我们需要一个一个写吗?答案肯定不是的,上面我们的类继承了Form,现在我们继承ModelForm就能达成我们的需求。

from django import forms
from crm import models
from django.core.exceptions import ValidationError
# 注册form
class RegForm(forms.ModelForm):  # 继承ModelForm,比Form功能强大
    '''
    这里重写之后会把Meta里的覆盖,这里如果没写,Meta里写了,Meta里的也不会生效
    '''
    password = forms.CharField(
        label='密码',
        min_length=6,
        widget=forms.widgets.PasswordInput,
        error_messages={
            'min_length': '最小长度为6位',
            'required': '密码不能为空',
        }
    )
    re_password = forms.CharField(
        label='确认密码',
        widget=forms.widgets.PasswordInput,
    )
    class Meta:  # 展示内容的配置
        model = models.UserProfile  # 用户表
        # fields = '__all__'  # 页面上显示数据表里的所有字段
        # exclude = ['','']  # 页面上不显示某些字段
        fields = ['username', 'password', 're_password', 'name', 'department']  # 页面上指定显示某些字段
        widgets = {   # 使用插件改写密码输入框的type类型
            'username': forms.widgets.EmailInput(attrs={'class':'form-control'}),  # 把username输入框的type改为email,添加一个class属性form-control
            'password': forms.widgets.PasswordInput,  # 改写密码输入框的type类型为password
        }
        '''
        定义页面显示的内容
        '''
        labels = {
            'username':'用户名',
            'password':"密码",
            're_password': '确认密码',
            'name':'姓名',
            'department':'部门'
        }
    def __init__(self, *args, **kwargs):  # 获取每一个字段,往里面加class属性
        super().__init__(*args, **kwargs)
        for filed in self.fields.values():
            filed.widget.attrs.update({'class':'form-control'})
    '''
    这里判断密码和确认密码是不是相同,如果不同,给出错误信息
    '''
    def clean(self):
        pwd = self.cleaned_data.get('password')
        re_pwd = self.cleaned_data.get('re_password')
        if pwd == re_pwd:
            return self.cleaned_data
        self.add_error('re_password','两次密码不一致')  # 给re_password添加一个错误信息
        raise ValidationError('两次密码不一致')  # 抛出错误信息

ModelForm的强大之处不止于此,比如你要编辑一条数据,你是不是需要把这条数据查询出来,在输入框里显示,然后在进行编辑,之前我们查询出来之后,然后一个一个的循环显示在输入框里。ModelForm提供了简单的方法。

# 编辑客户
def edit_customer(request, edit_id):
    # 根据id查询出要编辑的客户对象
    obj = models.Customer.objects.filter(id=edit_id).first()
    # 将查询到的对象和对应的html渲染
    form_obj = CustomerForm(instance=obj)  重要
    if request.method == 'POST':
        # 将提交的数据和要修改的实例交给form对象
        form_obj = CustomerForm(request.POST, instance=obj)   重要
        if form_obj.is_valid():
            # 修改后保存
            form_obj.save()
            return redirect(reverse('customer'))
    return render(request,'crm/edit_customer.html',{'form_obj': form_obj})

说明: form_obj = CustomerForm(request.POST, instance=obj) 里如果没有instance=obj,则是新增

 

自定义校验规则


虽然Django里的Form给我们提供了一些常用的规则,但往往满足不了产品经理的sb需求,这时候就要我们自己定义校验规则了,Django给我们提供了两种校验规则,一种是可以通过正则的方式,另一种是自定义函数。

通过正则的方式

先来写个form验证的

from django import forms
from django.core.validators import RegexValidator
class Phone(forms.Form):
    phone = forms.CharField(
        label='手机号',
        validators=[
            RegexValidator(r'^1[3-9]\d{9}$', '手机号格式不正确')
        ]
    )

这里要导入RegexValidator,然后在里面写正则,第一个参数是正则表达式,第二个是错误信息

在来写对应的视图函数

from appTest01 import forms
def register2(request):
    form_obj = forms.Phone()
    if request.method == 'POST':
        form_obj = forms.Phone(request.POST)
        if form_obj.is_valid():
            return HttpResponse('注册成功')
    return render(request, 'register1.html', {"form_obj": form_obj})

最后来写html页面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <form action="" method="post">
        {% csrf_token %}
        {{ form_obj.phone.label }}
        {{ form_obj.phone }}
        <button>提交</button>
        {{ form_obj.errors.phone.0 }}
    </form>
</body>
</html>

这样我们就通过了正则来验证了我们输入的手机号是不是符合格式

通过自定义函数来验证

from django.core.validators import RegexValidator
from django.core.exceptions import ValidationError
def check(value):
    if 'ma' in value:
        raise ValidationError('输入的有非法字符')
class Phone(forms.Form):
    phone = forms.CharField(
        label='手机号',
        validators=[
            check
        ]
    )

其他的地方都不需要改,如果输入框里包含“ma”则认为非法


相关文章
|
1月前
|
数据库 开发者 UED
如何使用Django的Form组件
如何使用Django的Form组件
26 0
|
8月前
|
数据库 数据安全/隐私保护 Python
|
10月前
|
存储 前端开发 JavaScript
Django第4步_理解form表单类与处理html的post、get
Django第4步_理解form表单类与处理html的post、get
58 0
|
前端开发 数据库 Python
Django Web 极简教程(六)- Django Form(Part A)
Django Web 极简教程(六)- Django Form(Part A)
Django Web 极简教程(六)- Django Form(Part A)
|
存储 SQL 前端开发
Django Blog | 10 自定义Form,美化页面并实现文章编辑功能
Django Blog | 10 自定义Form,美化页面并实现文章编辑功能
379 0
Django Blog | 10 自定义Form,美化页面并实现文章编辑功能
|
前端开发 JavaScript 数据库
Django中的Form组件
一、form组件的主要功能: 生成页面的HTML标签及样式 对用户提交的数据进行校验 自动生成错误信息 保留上次输入信息 二、使用form组件实现注册功能 1、在Django项目下创建一个文件夹,在文件夹中创建一个朋友文件,名字随便起,之后在py文...
1328 0
|
JavaScript 前端开发 Python
Django中ajax技术和form表单两种方式向后端提交文件
一、Form表单方式提交: form表单提交文件或者图像时需要对form中的属性进行如下设置: 1、method="post" //提交方式 post 2、enctype="multipart/form-data" //不对字符编码。
1907 0
|
Web App开发 前端开发 数据安全/隐私保护
Django之路——9 Django的form组件的信息校验
forms组件 校验字段功能 针对一个实例:注册用户讲解。 模型:models.py class UserInfo(models.Model): name=models.
1514 0
|
Python 安全
Django在form提交CSRF验证失败. 相应中断问题
CSRF验证失败. 相应中断. 1).首先,我们可以先看一下出现问题的所在的原因。 Your browser is accepting cookies. The view function passes a request to the template's render method.
1694 0
|
前端开发 数据库 数据安全/隐私保护
第21天,Django之Form组件
ModelForm 请参考官方文档 一、Form组件初识 参考博客一 武沛奇老师博客参考博客二 Django的Form主要具有一下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面显示内容 models.
1146 0