3 django系列之Form表单在前端web界面渲染与入库保存
author: 温柔易淡(Leo),欢迎技术交流与拍砖
preface
我们在前端写表单的时候,其实可以使用django自带的forms功能来实现,特别是在处理 修改已经存在数据 的场景特别好用,下面说说他。
后台代码
我们先从后台说起,这个流程是这样的:当用户查看某一个条目的详细新的时候,我们首先获取这个条目的详细信息在数据库里,然后塞入到表单里面渲染,这样传到前端就是这个条目的详细信息了,用户可以修改然后保存。
对此我们需要做的工作就是application下面创建一个form的py文件,我创建的文件名是formself,文件结构如下:
文件结构
[root@linux-node2 devops]# tree BatchM
BatchM # 项目名
├── Batch # application名字
│ ├── formself.py # form文件,自定义
formself里面的代码如下:
from django.forms import Form,ModelForm # 导入这两个模块
# ModelForm把 models里到数据变成一个表单,可以用的html页面上
from Batch import models
class ApplyUpdateForm(ModelForm):
class Meta:
model = models.WorkOrderOfUpdate # 和哪个数据库绑定在一块
exclude = ('email_issend','tags',) # 排除哪个字段
def __init__(self, *args, **kwargs):
# 继承父类,后重写自己的类
super(ApplyUpdateForm, self).__init__(*args, **kwargs)
for field_name in self.base_fields: # 遍历每一个字段
field = self.base_fields[field_name]
field.widget.attrs.update({'class': 'form-control'}) # 给每一个输入框添加上一个样式
我们在看看views里面的代码
from Batch import models
from Batch import formself #导入刚才我们自定义的form文件
def apply_detail(request,order_id):
'''
显示一个工单详情
:param request:
:param order_id: 工单ID
:return:
'''
order_detail = models.WorkOrderOfUpdate.objects.get(OrderId=order_id) # 取出这个条目的所有信息
form = formself.ApplyUpdateForm(instance=order_detail) # 把这个条目的信息塞入到表单里,instance就是从哪个对象里面获取数据
return render(request,'update_order_detail.html',{'selfforms':form}) # 把做好的表单返回到前端html文件里面通过form这个对象。
我们再看看html文件代码
'''省去不相关的代码
{% block page_content %} # 使用jinja修改母板的内容
<a href="/BatchM/apply_update.html/search/"><button class="btn btn-default" >返回上一页</button></a><br><br>
{{ selfforms }} # 写上这个,就能够自动在前端展示弄好的表单了。
{% endblock %}
好了,展示功能搞定了,还可以在这基础之上做一个保存功能,即在用户修改完表单的内容后,提交它,后端把这些表单的数据入库。我们就需要在后端添加几行代码,主要针对post请求处理,前端只添加需要<form> </form> <input type='submit' value=‘提交’>2个类型标签,申明提交地址,提交方法为post,就行了。
通过form保存数据
后端view代码如下:
from Batch import models
from Batch import formself #导入刚才我们自定义的form文件
def apply_detail(request,order_id):
'''
显示一个工单详情
:param request:
:param order_id: 工单ID
:return:
'''
if request.method == "GET":
order_detail = models.WorkOrderOfUpdate.objects.get(OrderId=order_id) # 取出这个条目的所有信息
form = formself.ApplyUpdateForm(instance=order_detail) # 把这个条目的信息塞入到表单里,instance就是从哪个对象里面获取数据
render(request,'update_order_detail.html',{'selfforms':form}) #把做好的表单返回到前端html文件里面通过form这个对象。
elif request.method == "POST": # 处理提交上来的数据
form_obj = getattr(formself,ApplyUpdateForm) # ApplyUpdateForm是在formself定义好的类
fm_result = form_obj(request.POST) # 把提交的数据塞入刚才的对象里面
if fm_result.is_valid(): # 如果数据与数据库表之间能够匹配,也就是提交的表单内容正确
fm_result.save() # 那么就入库。
return return HttpResponseRedirect('/')
else:
return HttpResponse('信息不全')
前端代码就不在赘述了。
至此,form的简单介绍到此结束,更多功能可以参考官网地址:https://docs.djangoproject.com/en/1.10/topics/forms/
3 django系列之Form表单在前端web界面渲染与入库保存的更多相关文章
- Django组件之Form表单
一.Django中的Form表单介绍 我们之前在HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来. 与此同时我们在好多场景下都需要对用户的输入 ...
- 第三百一十一节,Django框架,Form表单验证
第三百一十一节,Django框架,Form表单验证 表单提交 html <!DOCTYPE html> <html lang="en"> <head& ...
- Django框架 之 Form表单和Ajax上传文件
Django框架 之 Form表单和Ajax上传文件 浏览目录 Form表单上传文件 Ajax上传文件 伪造Ajax上传文件 Form表单上传文件 html 1 2 3 4 5 6 7 <h3& ...
- Django学习系列之Form表单结合ajax
Forms结合ajax Forms的验证流程: 定义用户输入规则的类,字段的值必须等于html中name属性的值(pwd= forms.CharField(required=True)=<i ...
- Django中的Form表单
Django中已经定义好了form类,可以很容易的使用Django生成一个表单. 一.利用Django生成一个表单: 1.在应用下创建一个forms文件,用于存放form表单.然后在forms中实例华 ...
- Django中的Form表单验证
回忆一下Form表单验证的逻辑: 前端有若干个input输入框,将用户输入内容,以字典传递给后端. 后端预先存在一个Form表单验证的基类,封装了一个检测用户输入是否全部通过的方法.该方法会先定义好错 ...
- Django 中的Form表单认证
一.Form表单 1.1 Form的几个功能 验证用户数据(显示错误信息) 初始化页面显示内容 HTML Form提交保留上次提交数据 生成HTML标签 1.2 创建表单类Form 1. 创建 ...
- the django travel three[form表单验证]
一:表单验证: 场景:因为浏览器的js可以被禁用,所以需要做后台的输入合法的验证. A:ajax发请求.需要注意的是ajax POST的数据的key值和form表单的里的字段名字一致,否则得不到验证! ...
- Django基础之Form表单验证
Form表单验证 1.创建Form类(本质就是正则表达式的集合) from django.forms import Form from django.forms import fields from ...
随机推荐
- iOS 下拉刷新-上拉加载原理
前言 讲下拉刷新及上拉加载之前先给大家解释UIScrollView的几个属性 contentSize是UIScrollView可以滚动的区域. contentOfinset 苹果官方文档的解释是&qu ...
- iOS7之后设置NavigationBar的背景
iOS7之后,请注意需要使用setBarTintColor ``` [self.navigationController.navigationBar setBarTintColor:[UIColor ...
- Git 少用 Pull 多用 Fetch 和 Merge
本文有点长而且有点乱,但就像Mark Twain Blaise Pascal的笑话里说的那样:我没有时间让它更短些.在Git的邮件列表里有很多关于本文的讨论,我会尽量把其中相关的观点列在下面. 我最常 ...
- ckplayer 如何在PC上完美支持 m3u8播放
使用过ckplayer的同学都知道,相对jwplayer等,它非常的容易配置和使用.功能也是基本满足我们的需求的. 一般情况我们都使用普通的视频格式比如mp4,flv等播放,但如果视频文件过大,会加载 ...
- nodejs---修改文件名字
D:\node\update_name目录有如下文件: 1:文件夹:icons 2:js文件:update-name.js js文件代码: // 引入fs文件处理模块var fs = require( ...
- javaWeb项目中Web.xml的基本配置
这个地址写的非常好 ,欢迎大家访问 Å:http://www.cnblogs.com/hxsyl/p/3435412.html 一.理论准备 先说下我记得xml规则,必须有且只有一个根节点,大小写敏感 ...
- Linux:常用命令
文件压缩.解压 网络.进程 磁盘.文件使用情况 内存使用 1.文件压缩.解压 1)tar.gz文件解压: .bin.tar.gz 解压到指定目录: (指定的目录是存在的) .bin. 2)zip 文件 ...
- Oracle的SQL基础
1.了解SQL的种类 (1)DDL 数据定义语言:定义数据库中数据要如何存储的,包括对数据库对象的创建(create)修改(alter)删除(drop)的操作,这些对象主要有数据库,数据表,视图,索引 ...
- 使用python的Flask实现一个RESTful API服务器端[翻译]
最近这些年,REST已经成为web services和APIs的标准架构,很多APP的架构基本上是使用RESTful的形式了. 本文将会使用python的Flask框架轻松实现一个RESTful的服务 ...
- Android的Handler机制
Handler机制的原理 Android 的 Handler 机制(也有人叫消息机制)目的是为了跨线程通信,也就是多线程通信.之所以需 要跨线程通信是因为在 Android 中主线程通常只负责 UI ...