在服务器端正确解析数组输入

问题描述 投票:0回答:1

环境 :-

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个回答
0
投票

这里有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(安装lib和静态文件)

<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>

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();
                });
            })
        }
    });
});

卖弄.朋友

# -*- 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'将成为一个数组

© www.soinside.com 2019 - 2024. All rights reserved.