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 ...
随机推荐
- Hibernate 系列 04 - Hibernate 配置相关的类
引导目录: Hibernate 系列教程 目录 前言: 通过上一篇的增删改查小练习之后,咱们大概已经掌握了Hibernate的基本用法. 我们发现,在调用Hibernate API的过程中,虽然Hib ...
- 使用bulkload向hbase中批量写入数据
1.数据样式 写入之前,需要整理以下数据的格式,之后将数据保存到hdfs中,本例使用的样式如下(用tab分开): row1 N row2 M row3 B row4 V row5 N row6 M r ...
- MySQL优化一例
DELIMITER $$ USE `xxx`$$ DROP FUNCTION IF EXISTS `F_getBuluDates`$$ CREATE DEFINER=`root`@`localhost ...
- android android BitmapFactory报错OOM
解决方法:listview中尽量不要使用ImageView作为item的组件 换成view并设background
- Java 性能优化之 String 篇
原文:http://www.ibm.com/developerworks/cn/java/j-lo-optmizestring/ Java 性能优化之 String 篇 String 方法用于文本分析 ...
- c#根据绝对路径获取 带后缀文件名、后缀名、文件名
zz C#根据绝对路径获取 带后缀文件名.后缀名.文件名 1.c#根据绝对路径获取 带后缀文件名.后缀名.文件名. string str =" F:\test\Default.aspx& ...
- Openvpn 撤销签署的证书(删除用户)
https://wiki.archlinux.org/index.php/Easy-rsa Revoking certificates and alerting the OpenVPN server ...
- Hadoop 2.x
Hadoop 2.x 生态系统及技术架构图 一.负责收集数据的工具:Sqoop(关系型数据导入Hadoop)Flume(日志数据导入Hadoop,支持数据源广泛)Kafka(支持数据源有限,但吞吐大) ...
- [LeetCode] Second Highest Salary 第二高薪水
Write a SQL query to get the second highest salary from the Employee table. +----+--------+ | Id | S ...
- Android实现类似换QQ头像功能(图片裁剪)
现在几乎所有的App都有用户登录模块,需要设置用户头像,而关于用户头像部分无疑也是比较头疼的,目前大部分应用的头像部分会有两种方式:一种是利用系统的裁剪功能去获取用户头像,一种就是获取到图片或者照片的 ...