Flask探索- 使用模态框进行编辑数据回显和传统处理方案的比较

大家好,我是金鱼座,一个走在测试领域这片蓝海中, 蹉跎前行的技术渣渣,唯有一直走下去,也许能改变点什么,加油!

最近在开发测试用例管理平台时, 由于之前的案例一直都是采用添加和编辑页面都是独立html方案,后面的视图方法中最终总是可以通过wtform中的方式进行数据回显, 编辑页面时可以显示他对应的值,考虑到日常平台使用,这种页面层级过长,使用不便,所以自己想升级使用弹出框的大众方案

在这过程中,突然发现一个问题, 就是弹出框形式无法像html一样,通过render_template来将form表单的值回显到页面中,通过个人的咨询, 考虑使用最简单的Ajax请求来获取数据需要的数据,然后在Ajax中success中通过js回填

回顾老的方案:
思路:通过render_template渲染,将Form中的值,渲染到页面中
form表单

<form role="form" method="post">
     {% for msg in get_flashed_messages(category_filter=["no"]) %}
        <div class="alert alert-danger alert-dismissible">
            <button type="button" class="close" data-dismiss="alert" aria-hidden="true">×</button>
            <h4><i class="icon fa fa-ban"></i> 添加失败!</h4>
            {{ msg }}
        </div>
     {% endfor %}
     {% for msg in get_flashed_messages(category_filter=["ok"]) %}
        <div class="alert alert-success alert-dismissible">
            <button type="button" class="close" data-dismiss="alert" aria-hidden="true">×</button>
            <h4><i class="icon fa fa-ban"></i> 添加成功!</h4>
            {{ msg }}
        </div>
     {% endfor %}
    <div class="box-body">
        <div class="form-group">
            <label for="InputCode">{{ form.code.label }}</label>
{#                            <input type="text" class="form-control" id="exampleInputEmail1" placeholder="Model Code">#}
            {{ form.code }}
        </div>
        {% for err in form.code.errors %}
            <div class="col-md-12">
                <font style="color: red">{{ err }}</font>
            </div>
        {% endfor %}
        <div class="form-group">
            <label for="InputName">{{ form.name.label }}</label>
{#                            <input type="text" class="form-control" id="exampleInputPassword1" placeholder="Model Name">#}
            {{ form.name }}
        </div>
        {% for err in form.name.errors %}
            <div class="col-md-12">
                <font style="color: red">{{ err }}</font>
            </div>
        {% endfor %}

    </div>
    <!-- /.box-body -->

    <div class="box-footer">
{#                        <button type="submit" class="btn btn-primary">Submit</button>#}
        {{ form.submit }}
        {{ form.csrf_token }}
    </div>
</form>

视图处理

@admin.route('/prd/edit/<int:id>', methods=["POST", "GET"])
def product_edit(id=None):
    product = Product.query.get(id)
    productform = ProductForm(name=product.name, code=product.code)         # 该内容可以让编辑页面默认显示当前的内容
    if productform.validate_on_submit():
        data = productform.data
        count = Product.query.filter_by(name=data["name"]).count()
        if count == 1:
            if data["name"] == product.name and data["code"] == product.code:
                flash("模型未修改", "no")
                return redirect(url_for("admin.product_edit", id=id))
            else:
                flash("模型已存在", "no")
                return redirect(url_for("admin.product_edit", id=id))
        product.name = data["name"]
        product.code = data["code"]
        db.session.merge(product)
        db.session.commit()
        flash("模型修改成功", "ok")
        return redirect(url_for("admin.product_edit", id=id))
    return render_template("product/product_edit.html", form=productform, model=product)

优点:前后端只需要通过form来完成数据回填和显示, 操作简单
缺点:页面层级增加一级,总是需要回退,较为麻烦

方案如下:
思路:通过Ajax请求获得数据,然后进行js数据回填

表单form

<div id="editcase" class="modal inmodal" tabindex="-1" role="dialog" aria-hidden="true">
    <div class="modal-dialog">
        <form class="form-horizontal"  role="form" method="post" id="editform" >
            <div class="modal-content">
                <div class="modal-header">
                    <button type="button" class="close" data-dismiss="modal" aria-label="Close">
                        <span aria-hidden="true">×</span></button>
                    <h4 class="modal-title">编辑用例</h4>
                </div>
                <div class="modal-body">
                    <div class="form-group">
                        <label class="col-sm-2 control-label">所属产品:</label>
                        <div class="col-sm-10">
{#                                                    <input type="text" class="form-control" name="a" placeholder="Model Code">#}
                            {{ form.proid }}
                        </div>
                    </div>
                    <div class="form-group">
                        <label class="col-sm-2 control-label">操作步骤:</label>
                        <div class="col-sm-10">
{#                                                    <input type="text" class="form-control" name="a" placeholder="Model Code">#}
                            {{ form.casestep }}
                        </div>
                    </div>
                    <div class="form-group">
                        <label class="col-sm-2 control-label">期望结果:</label>
                        <div class="col-sm-10">
{#                                                    <input type="text" class="form-control" name="a" placeholder="Model Code">#}
                            {{ form.caseresult }}
                        </div>
                    </div>
                </div>
                <div class="modal-footer">
                    <div class="box-footer">
                        <button type="button" class="btn btn-default pull-left" data-dismiss="modal">关闭</button>
{#                                                <button type="submit" class="btn btn-info pull-right">提交</button>#}
                        {{ form.submit }}
                        {{ form.csrf_token }}
                    </div>
                </div>
            </div>
        </form>
        <!-- /.modal-content -->
    </div>
                            <!-- /.modal-dialog -->
</div>

视图函数

@case_app.route("/get_case_message", methods=["POST"])
def get_case_message():
    data = json.loads(request.values.get('data'))
    id = data["id"]
    case = _Case.query.filter_by(id=id).first()
    success = {'status': 'success', 'msg': "重置成功"}
    success["caseid"] = case.id
    success["proid"] = case.proid
    success["menuid"] = case.menuid
    success["casecode"] = case.casecode
    success["casetype"] = case.casetype
    success["casepre"] = case.casepre
    success["casedesc"] = case.casedesc
    success["casestep"] = case.casestep
    success["caseresult"] = case.caseresult
    data = json.dumps(success)
    return Response(data, content_type='application/json')

ajax处理

function getmessage(obj) {
{#    $('#edit').click( function () {#}

    debugger;
    var id = $(obj).attr("id");
    $.ajax({
        type: 'post',
        url: '{{ url_for("case_app.get_case_message") }}',
        dataType: 'json',
        data: {
            data: JSON.stringify({
                'id': id
            })
        },
        success: function (data) {
            if (data.status == 'success') {
                document.getElementsByName("proid")[1].value = data.proid;
                document.getElementsByName("menuid")[1].value = data.menuid;
                document.getElementsByName("casecode")[1].value = data.casecode;
                document.getElementsByName("casetype")[1].value = data.casetype;
                document.getElementsByName("casepre")[1].value = data.casepre;
                document.getElementsByName("casedesc")[1].value = data.casedesc;
                document.getElementsByName("casestep")[1].value = data.casestep;
                document.getElementsByName("caseresult")[1].value = data.caseresult;
##################
//此处注意,主要是为了实现编辑弹出框可以更加点击的记录实时显示值,并且提交到执行的后端处理
                document.getElementById("editform").setAttribute("action", "/cases_/case/edit/"+data.caseid);
##################
                $('#editcase').modal('show');
            }
            else {
                alert(data.msg);
            }
        },
        error: function () {
            console.log(data);
            alert("获取数据失败,请重新打开编辑页面");
        }
    });
}

优点:界面显示操作符合大众操作习惯,使用起来简便
缺点:涉及到Ajax,视图处理多了一个ajax处理

有些同学可能对第二个弹出框方案中有疑问,既然无法使用render_template进行模板渲染,为什么弹出框中依旧用的form模板渲染格式呢,
此处我想解释下,上述的渲染我是在列表页面中渲染出来了,也就是说无论添加框还是编辑框全部在打开列表页面时就已经渲染html出来了

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,185评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,652评论 3 393
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,524评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,339评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,387评论 6 391
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,287评论 1 301
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,130评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,985评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,420评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,617评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,779评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,477评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,088评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,716评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,857评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,876评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,700评论 2 354