【问题标题】:Parse array input correctly on server side在服务器端正确解析数组输入
【发布时间】:2018-01-02 14:20:20
【问题描述】:

环境:-

Odoo 9、Python 2.7

我有一个看起来像这样的 HTML 表单:-

客户端部分:-

<form method="POST">
    <input type="text" name="series[1234][name]" />
    <input type="text" name="series[1234][value]" />
    <input type="text" name="series[1235][name]" />
    <input type="text" name="series[1235][value]" />
    <input type="submit" />
</form>

服务器部分:-

import http
# Other Imports


class Demo(http.Controller):
   @http.route([
        '/readable/url',
    ], type='http', auth="user", website=True)
    def readable_url(self, **request):
        # I am getting this

        # {
        #      'series[1234][name]' = 123,
        #      'series[1234][value]' = 22,
        #      'series[1235][name]' = 43,
        #      'series[1235][value]' = 4434,
        #  }


       # But I want like this

       # series = {
       # '1234' = {'name' = 123, 'value' = 22},
       # '1235' = {'name' = 43, 'value' = 4434},
       # }

我可以根据需要转换此请求,但如果有任何预定义的转换方式,请告诉我。

【问题讨论】:

    标签: python openerp odoo-9 odoo-website


    【解决方案1】:

    github 或 npm 上有解决方案

    $ npm install form-serializer
    

    复制odoo模块结构中的/dist/jquery.serialize-object.min.js

    addons/<my_module_name>/
    |-- __init__.py
    |-- __openerp__.py
    |-- controllers/
    |    |-- __init__.py
    |    `-- main.py
    |-- static/
    |    |-- lib/
    |    |    `-- jquery.serialize-object.min.js
    |    `-- src/
    |        `-- js/
    |             `-- yourJsModule.js
    `-- views/
        |-- templates.xml
        |-- assets.xml
    

    assets.xml(安装库和静态文件)

    <template id="assets_frontend" inherit_id="website.assets_frontend">
      <xpath expr="." position="inside">
        <script type="text/javascript" src="/<my_module_name>/static/lib/jquery.serialize-object.min.js"></script>
        <script type="text/javascript" src="/<my_module_name>/static/src/js/yourJsModule.js"></script>
      </xpath>
    </template>
    

    模板.xml

    <template id="index">
        <t t-call="website.layout">
            <t t-set="title">Demo</t>
            <div class="container">
                <form role="form" id="myform" class="form-horizontal">
                    <div class="form-group">
                        <label for="ProductName">
                        Series 1234 name
                    </label>
                        <input class="form-control" type="text" name="series[1234][name]" />
                    </div>
                    <div class="form-group">
                        <label for="ProductName">
                        Series 1234 value
                    </label>
                        <input class="form-control" type="text" name="series[1234][value]" />
                    </div>
                    <div class="form-group">
                        <label for="ProductName">
                        Series 1235 name
                    </label>
                        <input class="form-control" type="text" name="series[1235][name]" />
                    </div>
                    <div class="form-group">
                        <label for="ProductName">
                        Series 1235 value
                    </label>
                        <input class="form-control" type="text" name="series[1235][value]" />
                    </div>
                    <input type="button" value="sumbit" id="mysumbit"/>
                </form>
            </div>
        </t>
    </template>
    

    yourJsModule.js

    odoo.define('yourJsModule', function (require) {
        'use strict';
        var ajax = require('web.ajax');
    
        $(function () {
            if ($('#myform').length) {
                $('#mysumbit').on('click', function () {
                    var jsondata = $('#myform').serializeObject();
                    ajax.jsonRpc('/demo/json', 'call', jsondata).done(function (data) {
                        // your code here 
                        // location.reload();
                    });
                })
            }
        });
    });
    

    main.py

    # -*- coding: utf-8 -*-
    from openerp import http
    
    class MyModule(http.Controller):
        @http.route('/demo/index', auth='public', website=True)
        def index(self, **kw): 
            ## your code here init function
            return http.request.render("convert_form_data_to_json_demo.index", {})
    
        @http.route('/demo/json/', auth='public', type='json', website=True, method=['POST'])
        def post_data(self, **post): 
            ## your code here 
            return post
    

    P.S : 在这种情况下 '1234' '1235' 会变成一个数组

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-30
      • 2013-05-01
      • 1970-01-01
      相关资源
      最近更新 更多