zoukankan      html  css  js  c++  java
  • 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/

  • 相关阅读:
    leetcode-----16. 最接近的三数之和
    leetcode-----15. 三数之和
    leetcode-----14. 最长公共前缀
    leetcode-----13. 罗马数字转整数
    leetcode-----12. 整数转罗马数字
    leetcode-----11. 盛最多水的容器
    leetcode-----10. 正则表达式匹配
    leetcode-----9. 回文数
    leetcode-----8. 字符串转换整数 (atoi)
    leetcode-----7. 整数反转
  • 原文地址:https://www.cnblogs.com/liaojiafa/p/6238211.html
Copyright © 2011-2022 走看看