1.定义model.py

model中定义的字段类型,只有在通过form进行验证的时候才有效,数据库中的字段类型与其并不完全一致,如数据库中并没有ipaddress类型。如果不通过form对字段进行验证,则用户可以在前端输入任何类型数据而不会出错。

from django.db import models
class hv(models.Model):
name=models.CharField(max_length=100,unique=True,primary_key=True)
ip=models.GenericIPAddressField()
def __str__(self):
return self.name

2.定义froms.py

ModelForm将model和前台form连接到了一起

forms.Form并未连接后端的model,只是用来对前台输入进行判断其是否合法

from django import forms

from django.forms import ModelForm
from aptest.models import hv,vm,test #导入需要使用的model class hvform(ModelForm):
class Meta:
model = hv
fields = ['name','ip']
#fields = '__all__' #选择使用所有字段
#exclude = ['title'] #不适用某个字段
class vmform(ModelForm):
cpu=forms.CharField(max_length=5,error_messages={'required': 'Please enter your name'}) #重新对cpu字段进行格式限制,会覆盖Model中已定义的类型格式。自定义错误信息,需要知道具体错误的名称 如“requeired”这些名称可以在API 中找到  class Meta:
model = vm
fields = '__all__'

3.编辑views.py

def add(request):
if request.method == 'POST':
#print request.POST['hvname'],request.POST['hvip']
print request.method
form = hvform(request.POST) if form.is_valid(): #判断输入数据是否合法
#print form
#print form.cleaned_data['name'],form.cleaned_data['ip']
fc = form.cleaned_data
print fc['name'],fc['ip']
else:
err.append(form.errors) #输出错误信息
else:
form = hvform()
context={'hour_offset':hour_offset,'ls':ls,'err':err}
return render(request,'aptest/form.html',context)

4.编辑模板form.html

<!DOCTYPE html>
<html>
<head>
<title>ADD</title>
<link rel="stylesheet" href="http://apps.bdimg.com/libs/bootstrap/3.3.0/css/bootstrap.min.css">
<script src="http://apps.bdimg.com/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="http://apps.bdimg.com/libs/bootstrap/3.3.0/js/bootstrap.min.js"></script>
</head>
<body> <form class="form-horizontal" role="form" action="" method="post">
{% csrf_token %}
<!-- {{form.as_table}} --> <!--如果使用该方式,则在view中需要对form通过context渲染到模板,否则打开该页面看不到输入框-->
<div class="form-group">
<label for="name1" class="col-sm-2 control-label">name</label>
<div class="col-sm-10">
<input type="text" class="form-control" id="name1" name="name" value="{{form.name}}"> <!--此处value必须要定义,form不能被渲染到模板中。form.name为view中的 form=hvform(request.POST),不定义value,post的数据后台form无法接收到。name= 需要和value中的form.后面的名称相同 -->
</div>
</div>
<div class="form-group">
<label for="ip" class="col-sm-2 control-label">ip</label>
<div class="col-sm-10">
<input type="text" class="form-control" id="ip" name="ip" value="{{form.ip}}">
</div>
</div> <div class="form-group">
<div class="col-sm-offset-2 col-sm-10">
<button type="submit" class="btn btn-default">ADD</button>
</div>
</div>
</form> {% if err %}
<p style="color: red;">
Please correct the error: {{ err }} below.
</p>
{% endif %} </body>
</html>

访问输出:

在模版中通过{{form.as_table}} 方式显示form内容时,Django会自动的将外键字段转化成一个select的控件,并且通过下拉框来选择一个值,如下图:

context={'err':err,'form':form}
return render(request,'aptest/current_datetime.html',context)

使用ModelForm表单验证的更多相关文章

  1. Django ModelForm表单验证

    ModelForm 在使用Model和Form时,都需要对字段进行定义并指定类型,通过ModelForm则可以省去From中字段的定义 应用场景:定制model admin 的时候可以使用.适用于小业 ...

  2. 关于Django中的表单验证

    ModelForm 和 普通的Form 都可以做表单验证 对于ModelForm如果只是想验证其中一部分model中的field,可以指定:内部类Meta的fields元素: fields = ('x ...

  3. 第二十二章 Django会话与表单验证

    第二十二章 Django会话与表单验证 第一课 模板回顾 1.基本操作 def func(req): return render(req,'index.html',{'val':[1,2,3...]} ...

  4. Django学习笔记之表单验证

    表单概述 HTML中的表单 单纯从前端的html来说,表单是用来提交数据给服务器的,不管后台的服务器用的是Django还是PHP语言还是其他语言.只要把input标签放在form标签中,然后再添加一个 ...

  5. python自动化之djangoform表单验证

    djangoforms表单验证 创建个类,继承于 forms.form obj = FM(request.post) obj.is_valid() 如果验证没有问题会返回true,否则会返回false ...

  6. 第三百一十一节,Django框架,Form表单验证

    第三百一十一节,Django框架,Form表单验证 表单提交 html <!DOCTYPE html> <html lang="en"> <head& ...

  7. django 表单验证和字段验证

    表单验证和字段验证 表单验证发生在数据验证之后.如果你需要自定义这个过程,有几个不同的地方可以修改,每个地方的目的不一样.表单处理过程中要运行三种类别的验证方法.它们通常在你调用表单的is_valid ...

  8. 17.Django表单验证

    Django提供了3中方式来验证表单 官网文档:https://docs.djangoproject.com/en/1.9/ref/validators 1.表单字段验证器 a.引入:from dja ...

  9. 九 Django框架,Form表单验证

    表单提交 html <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...

随机推荐

  1. centos7-windows10 双系统安装

    win10默认, 然后压缩出来一个卷安装win7: http://www.techweb.com.cn/network/system/2016-12-21/2456741.shtml http://b ...

  2. Node.js http服务器搭建和发送http的get、post请求

    1.Node.js 搭建http服务器 1.1创建server.js var http = require('http'); var querystring = require('querystrin ...

  3. Nodejs学习笔记(十三)—PM2

    简介 PM2 pm2是一个内置负载均衡的node.js应用进程管理器(也支持Windows),其它的类似功能也有不少,但是感觉pm2功能更强,更值的推荐 GitHub地址:https://github ...

  4. ASP.NET Core WebAPI中使用JWT Bearer认证和授权

    目录 为什么是 JWT Bearer 什么是 JWT JWT 的优缺点 在 WebAPI 中使用 JWT 认证 刷新 Token 使用授权 简单授权 基于固定角色的授权 基于策略的授权 自定义策略授权 ...

  5. elasticsearch(一):JAVA api操作

    1.创建一个mavan项目,项目的以来配置如下. <?xml version="1.0" encoding="UTF-8"?> <projec ...

  6. 功能------常用快捷键(在win10下)

    功能------win10 常用快捷键 在进行学习,记录,编写代码时,需要用到一些功能,用鼠标浪费时间,可以使用快捷键来快速的处理.方便操作. 以下内容分为两类.快捷键以及触控板类(不能享用鼠标) 快 ...

  7. 玩转Git之初识Git

    git是什么 Git是一款免费.开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目 Git 和 svn 有什么区别 它们之间的主要区别是Git是分布式的,而svn是集中式. 当然Git也可 ...

  8. C# list的合并

    转自:https://www.cnblogs.com/liguanghui/archive/2011/11/09/2242309.html List<int> listA = new Li ...

  9. [C语言] 数据结构-算法效率的度量方法-事前分析估算方法

    事前分析估算方法:在计算机程序编制前,依据统计方法对算法进行估算,抛开与计算机硬件软件有关的因素,一个程序的运行时间,依赖于算法的,好坏和问题的输入规模,所谓问题输入规模是指输入量的多少 推导过程,比 ...

  10. [javaSE] 网络编程(概述)

    网络通信的步骤, 1.找到对方的ip 2.数据发送到对方指定的应用程序上,为了标识这些应用程序,用数字进行标识,这个数字就是端口 3.定义通信规则,这个规则就称为协议 国际组织定义了通用协议 TCP/ ...