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/

原文地址:https://www.cnblogs.com/liaojiafa/p/6238211.html