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 ...
随机推荐
- css知识点整理
CSS是Cascading Style Sheets的简称,中文称为层叠样式表,用来控制网页数据的表现,可以使网页的表现与数据内容分离. 一.css引入的方式 1.行内样式:行内式是在标记的style ...
- android Canvas 和 Paint用法
自定义view里面的onDraw方法,在这里我们可以绘制各种图形,onDraw里面有两个API我们需要了解清楚他们的用法:Canvas 和 Paint. Canvas翻译成中文就是画布的意思,Canv ...
- 原创 C++应用程序在Windows下的编译、链接:第三部分 静态链接(二)
3.5.2动态链接库的创建 3.5.2.1动态链接库的创建流程 动态链接库的创建流程如下图所示: 在系统设计阶段,主要的设计内容包括:类结构的设计以及功能类之间的关系,动态链接库的接口.在动态链接库中 ...
- lucky 的 时光助理
2017年的lucky小姐,厌倦了现在的工作,她觉得这些的工作对于她而言不具备挑战性,她在迷茫春节过后该如何选择, 这里是距她走出校门整整一年的时光. lucky小姐从开发走向了实施,目的是想周游这个 ...
- C#冒泡排序算法
用了两种形式的数据,一个是泛型List,一个是数据int[].记录一下,作为自己学习过程中的笔记. using System; using System.Collections.Generic; us ...
- [Hadoop]-从数据去重认识MapReduce
这学期刚好开了一门大数据的课,就是完完全全简简单单的介绍的那种,然后就接触到这里面最被人熟知的Hadoop了.看了官网的教程[吐槽一下,果然英语还是很重要!],嗯啊,一知半解地搭建了本地和伪分布式的, ...
- SSH整合
首先,SSH不是一个框架,而是多个框架(struts+spring+hibernate)的集成,是目前较流行的一种Web应用程序开源集成框架,用于构建灵活.易于扩展的多层Web应用程序. 集成SSH框 ...
- ngx_http_upstream_module模块.md
ngx_http_upstream_module ngx_http_upstream_module模块用于定义可由proxy_pass,fastcgi_pass,uwsgi_pass,scgi_pas ...
- 极路由2(极贰)在OpenWrt下定制自己的ss服务
默认刷入的OpenWrt带的ss, 只有ss-redir服务, 但是在实际使用中, 很多时候还是希望访问直接通过正常网关, 只有少部分访问需要通过ss, 所以希望能配置成为ss-local服务. 在保 ...
- Python学习Day2笔记(字符编码和函数)
1.字符编码 #ASCII码里只能存英文和特殊字符 不能存中文 存英文占1个字节 8位#中文编码为GBK 操作系统编码也为GBK#为了统一存储中文和英文和其他语言文字出现了万国码Unicode 所有一 ...