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界面渲染与入库保存的更多相关文章

  1. Django组件之Form表单

    一.Django中的Form表单介绍 我们之前在HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来. 与此同时我们在好多场景下都需要对用户的输入 ...

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

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

  3. Django框架 之 Form表单和Ajax上传文件

    Django框架 之 Form表单和Ajax上传文件 浏览目录 Form表单上传文件 Ajax上传文件 伪造Ajax上传文件 Form表单上传文件 html 1 2 3 4 5 6 7 <h3& ...

  4. Django学习系列之Form表单结合ajax

      Forms结合ajax Forms的验证流程: 定义用户输入规则的类,字段的值必须等于html中name属性的值(pwd= forms.CharField(required=True)=<i ...

  5. Django中的Form表单

    Django中已经定义好了form类,可以很容易的使用Django生成一个表单. 一.利用Django生成一个表单: 1.在应用下创建一个forms文件,用于存放form表单.然后在forms中实例华 ...

  6. Django中的Form表单验证

    回忆一下Form表单验证的逻辑: 前端有若干个input输入框,将用户输入内容,以字典传递给后端. 后端预先存在一个Form表单验证的基类,封装了一个检测用户输入是否全部通过的方法.该方法会先定义好错 ...

  7. Django 中的Form表单认证

    一.Form表单   1.1 Form的几个功能 验证用户数据(显示错误信息) 初始化页面显示内容 HTML Form提交保留上次提交数据 生成HTML标签   1.2 创建表单类Form 1. 创建 ...

  8. the django travel three[form表单验证]

    一:表单验证: 场景:因为浏览器的js可以被禁用,所以需要做后台的输入合法的验证. A:ajax发请求.需要注意的是ajax POST的数据的key值和form表单的里的字段名字一致,否则得不到验证! ...

  9. Django基础之Form表单验证

    Form表单验证 1.创建Form类(本质就是正则表达式的集合) from django.forms import Form from django.forms import fields from ...

随机推荐

  1. 块级标签包含行内标签底部出现3px间隔的解决办法

    当块级标签(如div)内包含了行内标签(如img),则外层元素与内层元素底部会出现3px的间隔: 代码如下: <!doctype html> <html lang="en& ...

  2. 磨刀不误砍柴工——VS生成事件

    如果说磨刀不误砍柴工,同样用好Visual Studio,会大大增加咱.NET程序猿效率.本文说的就是Visual Studio中的生成事件,在解决方案下右击某个项目然后选择 “属性” 打开窗口后即可 ...

  3. 看完你也能独立负责项目!产品经理做APP从头到尾的所有工作流程详解!

    (一)项目启动前 从事产品的工作一年多,但自己一直苦于这样或者那样的困惑,很多人想要从事产品,或者老板自己创业要亲自承担产品一职,但他们对产品这个岗位的认识却不明晰,有的以为是纯粹的画原型,有的是以为 ...

  4. oracle调用JAVA类的方法

    导入jar包 在oracle中导入需要的jar包,我们把编辑好的java类打成jar包,直接在oarcle里面写简单的调用就可以了,  1.操作系统需要拥有支持loadjava命令的jdk.  2.加 ...

  5. log4j:ERROR Failed to rename [/log/xxx.log] to [/log/xxx.log.2016-11-23.log]

    Log4j报错: log4j:ERROR Failed to rename [/log/xxx.log] to [/log/xxx.log.2016-11-23.log] google了一下发现是个b ...

  6. rhel7 单用户修改root密码

    rhel7密码忘记的时候,可以通过单用户模式修改密码 1.修改 引导文件,添加rw init=/sysroot/bin/sh ,ctrl+x启动 2.切换根chroot /sysroot3.使用pas ...

  7. vim快捷键

    #vim  filename :scriptname //查看vim加载了哪些脚本 :set nu //设置行号 :set tabstop=4 //设置一个tab为4个空格长度 :set ai //设 ...

  8. android 闪屏还是会出现黑屏问题

    public class SplashActivity extends Activity{ @Override protected void onCreate(Bundle savedInstance ...

  9. Centos6.5安装mysql不能启动,应该安装mysql-server

    centos中安装mysql很简单如下命令即可 yum install mysql 装好了, 运行mysql ERROR 2002 (HY000): Can't connect to local My ...

  10. SCNU 2015ACM新生赛初赛【1007. ZLM的扑克牌】解题报告

            题目链接详见SCNU 2015新生网络赛 1007. ZLM的扑克牌 .         其实我在想这题的时候,还想过要不要设置求最小的排列,并且对于回文数字的话,可以把扑克牌折起来( ...