BBS论坛 自定义form组件
二、自定义form组件
from django import forms
from django.forms import widgets
from app01 import models # 定制form组件
class MyForm(forms.Form):
username = forms.CharField(max_length=8, min_length=3, label='用户名', error_messages={
'max_length': '用户名长度超啦,不能超过8位!',
'min_length': '兄dei,你输的用户名也太短了,最起码3位吧!',
'required': '这么大的框,你至少输点东西吧!',
}, widget=widgets.TextInput(attrs={
'class': 'form-control',
})) password = forms.CharField(max_length=8, min_length=3, label='密码', error_messages={
'max_length': '密码长度超啦,不能超过8位!',
'min_length': '兄dei,你输的密码也太短了,最起码3位吧!',
'required': '密码这种东西,你至少输点东西吧!',
}, widget=widgets.PasswordInput(attrs={
'class': 'form-control',
})) confirm_password = forms.CharField(max_length=8, min_length=3, label='确认密码', error_messages={
'max_length': '确认密码长度超啦,不能超过8位!',
'min_length': '兄dei,你输的确认密码也太短了,最起码3位吧!',
'required': '密码这种东西,你至少输点东西吧!',
}, widget=widgets.PasswordInput(attrs={
'class': 'form-control',
})) email = forms.EmailField(label='邮箱', error_messages={
'required': '邮箱不能为空啊!',
'invalid': '邮箱的格式你竟然写错了!'
}, widget=widgets.EmailInput(attrs={
'class': 'form-control'
})) # 局部钩子 --> 校验用户名是否存在
def clean_username(self):
username = self.cleaned_data.get('username')
user_obj = models.UserInfo.objects.filter(username=username).first()
if user_obj:
self.add_error('username', '这个用户名已经存在了,换一个试试吧!')
return username # 全局钩子函数 --> 校验密码是否一致
def clean(self):
password = self.cleaned_data.get('password')
confirm_password = self.cleaned_data.get('password')
if not password == confirm_password:
self.add_error('confirm_password', '兄弟,手抖了吧,两次输入的密码不一样啊!')
return self.cleaned_data


BBS论坛 自定义form组件的更多相关文章
- 仿照wtform自定义Form组件
仿照wtforms自定义Form组件 1.wtforms 点击查看源码分析及使用方法 2.自定义Form组件 #!usr/bin/env python # -*- coding:utf-8 -*- f ...
- 自定义Form组件
一.wtforms源码流程 1.实例化流程分析 # 源码流程 1. 执行type的 __call__ 方法,读取字段到静态字段 cls._unbound_fields 中: meta类读取到cls._ ...
- Tronado自定义Form组件
Tronado自定义Form组件 一.获取类里面的静态属性以及动态属性的方法 方式一: # ===========方式一================ class Foo(object): user ...
- Flask学习【第10篇】:自定义Form组件
wtforms源码流程 实例化流程分析 1 # 源码流程 2 1. 执行type的 __call__ 方法,读取字段到静态字段 cls._unbound_fields 中: meta类读取到cls._ ...
- Tronado【第2篇】:tronado自定义Form组件
Tronado自定义Form组件 一.获取类里面的静态属性以及动态属性的方法 方式一: # ===========方式一================ class Foo(object): user ...
- Flask【第10篇】:自定义Form组件
自定义Form组件 一.wtforms源码流程 1.实例化流程分析 1 # 源码流程 2 1. 执行type的 __call__ 方法,读取字段到静态字段 cls._unbound_fields 中: ...
- Flask系列(十)自定义Form组件
一.wtforms源码流程 1.实例化流程分析 # 源码流程 1. 执行type的 __call__ 方法,读取字段到静态字段 cls._unbound_fields 中: meta类读取到cls._ ...
- 基于wtforms源码实现自定义form组件
from flask import Flask,Markup,render_template,request,redirect from wtforms.form import Form from w ...
- 基于Django Form源码开发自定义Form组件
import copy import re class ValidateError(Exception): def __init__(self, detail): self.detail = deta ...
随机推荐
- MySQL之explain命令解释
explain显示了mysql如何使用索引来处理select语句以及连接表.可以帮助选择更好的索引和写出更优化的查询语句. 使用方法,在select语句前加上explain就可以了.如: explai ...
- webdriver使用已打开过的chrome
基本功能: 执行脚本a,打开一个chrome,脚本a执行完成,chrome未关闭. 执行脚本b,继续使用a打开的chrome,不新启浏览器. 附加: 如果已打开的chrome未关闭,则在chrome中 ...
- Servilet初步
以http://locahost:8080/......开头,或者以/开头,都是绝对路径以路径开头:相对路径 路径/路径 Servlet执行流程:(只用自己编写执行的代码,执行的细节全是tomcat封 ...
- YApi导入swagger生成的接口
1.swagger的JSON地址,net或netcore开发环境下 2.配置在内网中,localhost请用对应的IP地址替换,在浏览器地址栏中输入以上地址,会返回一个json格式的文档 3.导入 4 ...
- vue-router 使用二级路由去实现子组件的显示和隐藏
在需求中有一个这样的情况:一个组件在主组件和另外的组件中引用,且点击主组件和这个组件分别有相应得切换事件. 一开始的时候我是没有划分组件,把它们放到主组件内,这样便于切换,但是主主件内有独立的部分需要 ...
- windows IIS FTP 不支持创建多级目录
昨天因为这个事情搞了好久,因为客户那边使用的是IIS 上的FTP ,想着都差不多试着运行,结果竟然报错,说"错误550 文件不可用" 是在GetResponse()出现的异常,我用 ...
- VS系列远程调试
其实很多时候,远程调试的话,我还是更喜欢用WinDBG的, 首先,可以练习WinDBG的使用手段, 其次,可以增加WinDBG的熟练度, 最重要的,WinDBG在内核调试部分很常用,我也很喜欢它,所以 ...
- 四.python注释说明
Python第四节 Python注释 注释说明 注释分为单行注释和多行注释 单行注释以#开头 # 注释示例 > print("上面是一个注释的示例") 多行注释 多行注释可以 ...
- union 或者 union all 与 order by 的联合使用
首先清楚:多个select 语句 union 时不是简单的将查询结果拼接起来 而是将sql拼接起来编译(做为一个sql语句),然后去执行. 注: union 连接的语句中只会出现一个order by ...
- tomcat 端口被占用 项目端口号被占用怎么解决
1.Win+R 打开运行 ,输入cmd 打开命令行窗口 . 2.假设要查询端口被占用情况,在命令行下输入:netstat -aon|findstr "8883" 3.得到进程 ...