环境:-
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},
# }
我可以根据需要转换此请求,但请告诉我是否有任何预定义的方法来转换此请求。
这里有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
资产.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
PS:在这种情况下,'1234''1235'将成为数组