标签:input none message cep star code 提交 one char
# 第一步:定义一个类,继承forms.Form # 第二步:在类中写字段,要校验的字段,字段属性就是校验规则 # 第三步:实例化得到一个Form对象,把要校验的数据传入 # 第四步:调用register_form.is_valid()校验,校验通过就是True # 第五步:校验通过有register_form.cleaned_data # 第六步:校验不通过 register_form.errors
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>注册用户</title> <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.4.1/jquery.min.js"></script> <link href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/css/bootstrap.min.css" rel="stylesheet"> <script src="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/js/bootstrap.min.js"></script> </head> <body> <div class="col-md-6 col-md-offset-3"> <div class="panel panel-primary"> <div class="panel-heading"> <h3 class="panel-title">注册功能</h3> </div> <div class="panel-body"> <h1 class="text-center">注册</h1> <form action="" method="post"> <p>用户名:<input type="text" name="name" class="form-control"></p> <p>密码:<input type="password" name="password" class="form-control"></p> <p>确认密码:<input type="password" name="re_password" class="form-control"></p> <p>邮箱:<input type="text" name="email" class="form-control"></p> <input id="id_btn" type="submit" class="btn btn-primary btn-block"> </div> </div> </div> </body> </html>
class User(models.Model): name = models.CharField(max_length=32,verbose_name=‘用户名‘) password = models.CharField(max_length=32,verbose_name=‘密码‘) email = models.EmailField(verbose_name=‘邮箱‘)
# views.py from django.shortcuts import render from django import forms #定义类 class RegisterForm(forms.Form): # name字符串类型最大8位,最小3位 name = forms.CharField(max_length=8, min_length=3, label=‘用户名‘) # password字符串类型最大8位,最小3位 password = forms.CharField(max_length=8, min_length=3, label=‘密码‘) # re_password字符串类型最大8位,最小3位 re_password = forms.CharField(max_length=8, min_length=3, label=‘确认密码‘) # email必须符合邮箱格式,xxx@xx.com email = forms.EmailField(label=‘邮箱‘) #在视图中使用 register_form = RegisterForm(request.POST) if register_form.is_valid(): # 校验通过,存 # 取出校验通过的数据 print(‘校验通过‘) print(register_form.cleaned_data) # 存储前先删除多余的字段 register_form.cleaned_data.pop(‘re_password‘) # 将数据存入数据库的user表中 models.User.objects.create(**register_form.cleaned_data) else: # 校验不通过 print(‘校验不通过‘) print(register_form.errors)
def register(request): if request.method == ‘GET‘: # GET请求没有数据,需要生成一个空form对象 # 这个form跟下面没有关系,是get请求过来的得到一个空form register_form = RegisterFrom() # 传到前端页面后,通过form进行渲染 return render(request, ‘register.html‘, {‘form‘: register_form}) else: register_form = RegisterFrom(request.POST) if register_form.is_valid(): print(‘效验通过‘) print(register_form.cleaned_data) register_form.cleaned_data.pop(‘re_password‘) models.User.objects.create(**register_form.cleaned_data) else: print(‘效验不通过‘) print(register_form.errors) return render(request,‘register.html‘)
<h2>通过form自动渲染一</h2> <form action="" method="post"> <p>用户名 {{ form.name }}</p> <p>密码 {{ form.password }}</p> <p>确认密码 {{ form.re_password }}</p> <p>邮箱 {{ form.email }}</p> <input type="submit" value="提交">?</form>
推荐使用,代码书写简单,并且可扩展性强
<h2>通过form自动渲染二(基本用这种)</h2> <form action="" method="post"> {% for item in form %} <p>{{ item.label }}{{ item }}</p> {% endfor %} <input type="submit" value="提交"><span style="color: red">{{ error }}</span> </form>
代码书写极少,封装程度太高,不便于后续的扩展,一般情况下只在本地测试使用
<h2>通过form自动渲染三</h2> <form action="" method="post"> {{ form.as_p }} {# {{ form.as_table }}#} {# {{ form.as_ul }}#} </form>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>注册页面</title> <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.4.1/jquery.min.js"></script> <link href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/css/bootstrap.min.css" rel="stylesheet"> <script src="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/js/bootstrap.min.js"></script> </head> <body> <div class="col-md-6 col-md-offset-3"> <div class="panel panel-primary"> <div class="panel-heading"> <h3 class="panel-title text-center"></h3> </div> <div class="panel-body"> <h1 class="text-center">注册</h1> <form action="" method="post" novalidate> {% for item in form %} <div class="form-group"> <p>{{ item.label }}{{ item }} <span style="color: red">{{ item.errors.0 }}</span></p> </div> {% endfor %} <input type="submit" value="提交" class="form-control"><span style="color: red">{{ error }}</span> </form> </div> </div> </div> </body> </html>
from django import forms from django.forms import widgets class RegisterForm(forms.Form): name = forms.CharField(max_length=8, min_length=3, label=‘用户名‘, error_messages={ ‘max_length‘: ‘用户名最长为8位‘, ‘min_length‘: ‘用户名最短为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‘: ‘密码最短为3位‘, ‘required‘: ‘密码不能为空‘ }, widget=widgets.PasswordInput(attrs={‘class‘:‘form-control‘})) re_password = forms.CharField(max_length=8, min_length=3, label=‘确认密码‘, error_messages={ ‘max_length‘ : ‘密码最长为8位‘, ‘min_length‘ : ‘密码最短为3位‘, ‘required‘ : ‘密码不能为空‘ }, widget=widgets.PasswordInput(attrs={‘class‘:‘form-control‘})) email = forms.EmailField(label=‘邮箱‘, error_messages={‘required‘: ‘邮箱不能为空‘, ‘invalid‘: ‘邮箱格式不正确‘}, widget=widgets.TextInput(attrs={‘class‘:‘form-control‘})) # views视图函数处理部分: def register(request): if request.method == ‘GET‘: register_form = RegisterForm() return render(request, ‘register.html‘, {‘form‘: register_form}) else: register_form = RegisterForm(request.POST) if register_form.is_valid(): print(‘校验通过‘) print(register_form.cleaned_data) register_form.cleaned_data.pop(‘re_password‘) models.User.objects.create(**register_form.cleaned_data) return HttpResponse(‘ok‘) else: # 校验不通过 print(‘校验不通过‘) print(register_form.errors) return render(request, ‘register.html‘, {‘form‘: register_form})
class Ret(Form): name = forms.CharField(max_length=10, min_length=2, label=‘用户名‘, error_messages={ ‘required‘: ‘该字段不能为空‘, ‘invalid‘: ‘格式错误‘, ‘max_length‘: ‘太长‘, ‘min_length‘: ‘太短‘}, widget=widgets.TextInput(attrs={‘class‘:‘form-control‘}))
def clean_name(self): # name字段的局部钩子 # 获取用户输入的用户名 name = self.cleaned_data.get(‘name‘) # 校验名字不能以sb开头 if name.startswith(‘sb‘): # 校验不通过,必须抛异常, raise ValidationError(‘不能以sb开头‘) else: # 校验通过,再返回name对应的值 return name
def clean(self): # 全局钩子 password = self.cleaned_data.get(‘password‘) re_password = self.cleaned_data.get(‘re_password‘) if re_password != password: # 校验不通过 self.add_error(‘re_password‘,‘两次密码不一致‘) else: # 局部钩子拿什么返回什么,全局钩子所有都返回 return self.changed_data
from django.db import models # 创建用户表 class User(models.Model): name = models.CharField(max_length=32,verbose_name=‘用户名‘) password = models.CharField(max_length=32,verbose_name=‘密码‘) email = models.EmailField(verbose_name=‘邮箱‘)
from django.conf.urls import url from app01 import views urlpatterns = [ url(r‘^register/$‘,views.register) ]
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>模板层注册页面</title> <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.4.1/jquery.min.js"></script> <link href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/css/bootstrap.min.css" rel="stylesheet"> <script src="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/js/bootstrap.min.js"></script> </head> <body> <div class="container-fluid"> <div class="row"> <div class="col-md-6 col-md-offset-3"> <div class="panel panel-primary"> <div class="panel-heading"> <h3 class="panel-title text-center"></h3> </div> <div class="panel-body"> <h1 class="text-center">注册</h1> <form action="" method="post" novalidate> {% for item in form %} <div class="form-group"> <p>{{ item.label }}{{ item }} <span style="color: red">{{ item.errors.0 }}</span></p> </div> {% endfor %} <input type="submit" value="提交" class="btn btn-primary btn-block"><span style="color: red">{{ error }}</span> </form> </div> </div> </div> </div> </div> </body> </html>
from django import forms from django.forms import widgets from django.core.exceptions import ValidationError class RegisterForm(forms.Form): name = forms.CharField(max_length=8, min_length=3, label=‘用户名‘, error_messages={ ‘max_length‘: ‘用户名最长为8位‘, ‘min_length‘: ‘用户名最短为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‘: ‘密码最短为3位‘, ‘required‘: ‘密码不能为空‘ }, widget=widgets.PasswordInput(attrs={ ‘class‘:‘form-control‘ })) re_password = forms.CharField(max_length=8, min_length=3, label=‘确认密码‘, error_messages={ ‘max_length‘ : ‘密码最长为8位‘, ‘min_length‘ : ‘密码最短为3位‘, ‘required‘ : ‘密码不能为空‘ }, widget=widgets.PasswordInput(attrs={ ‘class‘:‘form-control‘ })) email = forms.EmailField(label=‘邮箱‘, error_messages={ ‘required‘: ‘邮箱不能为空‘, ‘invalid‘: ‘邮箱格式不正确‘ }, widget=widgets.TextInput(attrs={ ‘class‘:‘form-control‘ def clean_name(self): # name字段的局部钩子 # 获取用户输入的用户名 name = self.cleaned_data.get(‘name‘) # 校验名字不能以sb开头 if name.startswith(‘sb‘): # 校验不通过,必须抛异常, raise ValidationError(‘不能以sb开头‘) else: # 校验通过,再返回name对应的值 return name def clean(self): # 全局钩子 password = self.cleaned_data.get(‘password‘) re_password = self.cleaned_data.get(‘re_password‘) if re_password != password: # 校验不通过 self.add_error(‘re_password‘,‘两次密码不一致‘) else: # 局部钩子拿什么返回什么,全局钩子所有都返回 return self.changed_data from app01 import models def register(request): if request.method == ‘GET‘: # GET请求没有数据,需要生成一个空form对象 # 这个form跟下面没有关系,是get请求过来的得到一个空form register_form = RegisterFrom() # 传到前端页面后,通过form进行渲染 return render(request, ‘register.html‘, {‘form‘: register_form}) else: # 实例化得到对象,传入要校验的数据 register_form = RegisterForm(request.POST) if register_form.is_valid(): # 校验通过,存 # 取出校验通过的数据 print(‘校验通过‘) print(register_form.cleaned_data) register_form.cleaned_data.pop(‘re_password‘) models.User.objects.create(**register_form.cleaned_data) return HttpResponse(‘ok‘) else: # 校验不通过 print(‘校验不通过‘) print(register_form.errors) return render(request, ‘register.html‘, {‘form‘: register_form})
标签:input none message cep star code 提交 one char
原文地址:https://www.cnblogs.com/gfeng/p/14590589.html