表单代码「建议收藏」

表单代码「建议收藏」django表单:在App中新建的form.py表单文件:视图文件:例1模板:例2模板:例2models.py:url映射:ModelForm在表单中使用 ModelFor

大家好,又见面了,我是你们的朋友全栈君。

django表单:

  1. 渲染表单模板。
  2. 表单验证数据是否合法。

 

在App中新建的form.py表单文件:

 1 from django import forms  2 from django.core import validators  3 from .models import User  4  5 # 定义form表单,label:定义名字;error_messages:定义错误时内容的提示;(例1)  6 class MesssageBoardForm(forms.Form):  7 title = forms.CharField(max_length=10,min_length=2,label='标题',error_messages={'min_length':'最小不能少于两个字符','max_length':'不能超过十个字符'})  8 content = forms.CharField(widget=forms.Textarea,label='内容',error_messages={'required':'必须传content字段'})  9 email = forms.EmailField(label='邮箱',error_messages={'required':'必须传email字段'}) 10 reply = forms.BooleanField(required=False,label='是否回复') 11 12 # 可简化出错信息显示的内容,通用。 13 class BaseForm(forms.Form): 14 def get_errors(self): 15 errors = self.errors.get_json_data() 16 new_errors = {} 17 for key,message_dicts in errors.items(): 18 messages = [] 19 for message_dict in message_dicts: 20 message = message_dict['message'] 21  messages.append(message) 22 new_errors[key] = messages 23 return new_errors 24 25 # 进行注册信息的简单验证表单(例2) 26 class RegisterForm(BaseForm): 27 username = forms.CharField(max_length=20,min_length=2) 28 telephone = forms.CharField(validators=[validators.RegexValidator(r'1[345678]\d{9}',message='请输入正确的手机号码!')]) 29 pwd1 = forms.CharField(max_length=16,min_length=6,error_messages={'max_length':'不能超过十六个字符','min_length':'不能小于六个字符'}) 30 pwd2 = forms.CharField(max_length=16,min_length=6,error_messages={'max_length':'不能超过十六个字符','min_length':'不能小于六个字符'}) 31 32 def clean_telephone(self): 33 telephone = self.cleaned_data.get('telephone') 34 exists = User.objects.filter(telephone=telephone).exists() 35 if exists: 36 raise forms.ValidationError(message="%s已经被注册"%telephone) 37 return telephone 38 39 def clean(self): 40 cleaned_data = super().clean() 41 pwd1 = cleaned_data.get('pwd1') 42 pwd2 = cleaned_data.get('pwd2') 43 if pwd1 != pwd2: 44 raise forms.ValidationError(message='两次密码不一致!')

 

视图文件:

 1 from django.shortcuts import render  2 from django.views.generic import View  3 from .forms import MesssageBoardForm,RegisterForm  4 from django.http import HttpResponse  5 from .models import User  6  7 # 简单的表格格式(例1)  8 class IndexView(View):  9 # 将form传给html模板来生成一个表单的html代码; 10 # 使用form生成的代码填写格式与验证不对时会先提示,不运行; 11 def get(self,request): 12 form = MesssageBoardForm() 13 return render(request,'index.html',context={'form':form}) 14 15 # post提交时,使用form.is_valid判断提交的内容与form中定义的是否一致; 16 # cleaned_data:获取相应数据; 17 def post(self,request): 18 form = MesssageBoardForm(request.POST) 19 if form.is_valid(): 20 title = form.cleaned_data.get('title') 21 content = form.cleaned_data.get('content') 22 email = form.cleaned_data.get('email') 23 reply = form.cleaned_data.get('reply') 24 print(title) 25 print(content) 26 print(email) 27 print(reply) 28 return HttpResponse('success') 29 else: 30 # 打印出错的详细内容 31 print(form.errors.get_json_data()) 32 return HttpResponse('Fail') 33 34 # 注册信息的验证(例2) 35 class RegisterView(View): 36 # 返回注册页面模板; 37 # 不使用form的表单生成的代码,验证不对时仍会运行,没有预先提示; 38 def get(self,request): 39 return render(request,'register.html') 40 41 # 提交注册的数据 42 def post(self,request): 43 form = RegisterForm(request.POST) 44 # 验证通过 45 if form.is_valid(): 46 username = form.cleaned_data.get('username') 47 telephone = form.cleaned_data.get('telephone') 48 User.objects.create(username=username,telephone=telephone) 49 return HttpResponse('注册成功') 50 else: 51 print(form.errors.get_json_data()) 52 # 调用了BaseFrom模板后简化的出错信息; 53 print(form.get_errors()) 54 return HttpResponse('注册失败')

 

例1模板:

 1 {# 简单的index.html模板 #}  2 <form action="" method="post">  3 <table>  4  {{ form.as_table }}  5 <tr>  6 <td></td>  7 <td><input type="submit" value="提交"></td>  8 </tr>  9 </table> 10 </form>

 

例2模板:

 1 {# 注册验证的模板 register.html #}  2 <form action="" method="post">  3 <table>  4 <tr>  5 <td>用户:</td>  6 <td><input type="text" name="username"></td>  7 </tr>  8 <tr>  9 <td>电话:</td> 10 <td><input type="text" name="telephone"></td> 11 </tr> 12 <tr> 13 <td>密码:</td> 14 <td><input type="password" name="pwd1"></td> 15 </tr> 16 <tr> 17 <td>重复密码:</td> 18 <td><input type="password" name="pwd2"></td> 19 </tr> 20 <tr> 21 <td></td> 22 <td><input type="submit" value="提交"></td> 23 </tr> 24 </table> 25 </form>

 

例2 models.py:

1 from django.db import models 2 3 class User(models.Model): 4 username = models.CharField(max_length=20) 5 telephone = models.CharField(max_length=11)

 

url映射:

1 urlpatterns = [ 2 path('', views.IndexView.as_view()), 3 path('register/',views.RegisterView.as_view())

 

 

ModelForm

  在表单中使用 ModelForm ,定义一个 Meta 类,如在该类中指定 model=User ,以及 fields=__all__ ,等于将 User 模型中所有的字段都复制过来,进行验证。则不需要在表单中重复模型中已有的字段,减少代码。

models.py文件:

1 from django.db import models 2 from django.core import validators 3 4 class User(models.Model): 5 username = models.CharField(max_length=100,validators=[validators.MinLengthValidator(2)]) 6 password = models.CharField(max_length=16,validators=[validators.MinLengthValidator(6)]) 7 telephone = models.CharField(max_length=11,validators=[validators.RegexValidator(r'1[345678]\d{9}')])

 

 

forms.py文件:

 1 from django import forms  2 from .models import User  3  4 # 注册信息的验证:  5 class BaseForm(forms.ModelForm):  6 # 验证手机号是否存在;  7 def clean_telephone(self):  8 telephone = self.cleaned_data.get('telephone')  9 exists = User.objects.filter(telephone=telephone).exists() 10 if exists: 11 raise forms.ValidationError('%s手机号已存在' % telephone) 12 return telephone 13 14 # 验证用户名; 15 def clean_username(self): 16 username = self.cleaned_data.get('username') 17 exists = User.objects.filter(username=username).exists() 18 if exists: 19 raise forms.ValidationError('%s:用户名已被注册' % username) 20 return username 21 22 # 验证密码; 23 def clean(self): 24 cleaned_data = super().clean() 25 pwd1 = cleaned_data.get('pwd1') 26 pwd2 = cleaned_data.get('pwd2') 27 if pwd1 != pwd2: 28 raise forms.ValidationError('两次密码不一样') 29 else: 30 return cleaned_data 31 32 # 定义一个Meta类; 33 class RegisterForm(BaseForm): 34 pwd1 = forms.CharField(max_length=16,min_length=6,error_messages={'min_length':'不能小于6字符','max_length':'不能大于16字符'}) 35 pwd2 = forms.CharField(max_length=16,min_length=6,error_messages={'min_length':'不能小于6字符','max_length':'不能大于16字符'}) 36 37 class Meta: 38 model = User 39 # fields = ['username','telephone'] # 只提取某些字段; 40 # fields = '__all__' # 复制所有的字段; 41 exclude = ['password'] # 排除某个字段; 42 # 使用“errors_messages”定义错误信息 43 error_messages = { 44 'username':{ 45 'max_length':'不能超过100字符', 46 'min_length':'不能小于2字符' 47  }, 48 'telephone':{ 49 'invalid':'请输入正确的手机号码' 50  } 51 }

 

 

views.py文件:

 1 from django.shortcuts import render  2 from django.http import HttpResponse  3 from .forms import RegisterForm  4 from django.views.decorators.http import require_POST  5  6 # 验证完成可直接调用save方法,“commit=False”:只生成模型而不插入到数据库中;  7 @require_POST  8 def register(request):  9 form = RegisterForm(request.POST) 10 if form.is_valid(): 11 user = form.save(commit=False) 12 user.password = form.cleaned_data.get('pwd1') 13  user.save() 14 return HttpResponse('success') 15 else: 16 print(form.errors.get_json_data()) 17 return HttpResponse('Fail')

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/154237.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 第一课:什么是树莓派[通俗易懂]

    第一课:什么是树莓派[通俗易懂]楔子我对树莓派是情有独钟,不但在做这个方面的教学,而且录制了些教学视频,现在计划做几个树莓派的博客专栏,以弥补视频教学的不足。这是《树莓派系统专栏》的第一课,叫什么是树莓派(这也是我教学视频的第一课),希望给第一次接触树莓派的人有一个感性认识。树莓派长什么样我们要搞清楚一个刚接触的东西,最直观的是看它的实物,下面我就先上一张图。我希望上最好的图片给大家,包括专业和美感,这张图是树莓派官网…

  • 游戏辅助脚本论坛_开心躲猫猫穿墙版下载

    游戏辅助脚本论坛_开心躲猫猫穿墙版下载总结写开心外挂的心得对开心网的外挂编写做个总结,避免弯路。设计篇         针对需求的设计——需求向实现的转化             从调查切入点开始考虑如何着手,确定了基本的方式到写代码,并没有花太多精力,http访问、html解析都不复杂,但后续需求考虑不足造成最初的设计不能满足后续需要。比如后续加入的新模块轮询检索,定时执行都推翻了最初的设计。在设计阶…

  • pycha2021.5激活码[在线序列号][通俗易懂]

    pycha2021.5激活码[在线序列号],https://javaforall.cn/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

  • stata 导出 相关系数表_STATA数据处理技巧与计量分析二|基本语句介绍

    stata 导出 相关系数表_STATA数据处理技巧与计量分析二|基本语句介绍更多精彩内容请关注211统计课堂上期小统和大家一起了解了STATA数据处理技巧与计量分析的背景介绍,这期小统和大家一起学习一下基本语句介绍。Stata操作界面核心功能(dofile)Stata中的命令集合文件,在编程语言中成为脚本(scripts),是指为达到某一分析目的进行的数据读取、数据处理、分析等的命令集合。Stata的基础语法基本语法结构:funNamevariable/(v…

  • awvs使用方法_一般人游50米要多久

    awvs使用方法_一般人游50米要多久Awvs的是一款非常好用的web漏洞扫描工具,他的扫描速度比较快,可以自己选择扫描速度,比较灵活。Awvs分为老的版本和新版本,下面我介绍的是新版本的功能和用法。功能介绍如下:仪表盘(监视器)功能,添加目标功能,漏洞排序功能,扫描功能,发现功能,用户功能,扫描配置功能,网络扫描功能,追踪器功能,防火墙设置,邮件设置,引擎,时间排除功能,代理功能,常规设置主要使用的功能是前面的6个,后面的根据个人的需要进行配置详细介绍如下:Dashboard功能:翻译意思仪表盘(监视器),可以对扫描对扫描

  • windows安装anaconda python,pycharm[通俗易懂]

    windows安装anaconda python,pycharm[通俗易懂]windows安装anaconda python,pycharm

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号