15.odoo入门——工作遇到的odoo的一些细节和javascript实现数据库操作后跳转页面

来源:互联网 发布:淘宝网渔具店 编辑:程序博客网 时间:2024/06/07 00:46

第15天:

上午遇到的问题:git的使用陷入了困境,焦头烂额了一个上午- - 

问题1:kwargs的传参问题

解决方法:在一个只进行后台数据操作而不需要渲染html页面的操作中,我们可以在mainConrollers中定义一个函数a,虽然是通过路由找到该函数a,数据库操作完成后,直接返回另外一个函数b页面,由这个函数b进行渲染页面,我们只需要把函数b需要的数据作为字典,用**kwargs传入即可。

示例代码如下:

@http.route('/wens_investment/confirm_subscribe_record', type='http', auth='public', csrf=False)def confirm_subscribe_record(self,**kwargs):    id = kwargs.get("id")    programs_id = kwargs.get("programs_id")    print "this is confirm_subscribe_record"    print id,programs_id    subscribe_model = http.request.env['wens.investment.subscribed.records']    subscribe_list = subscribe_model.sudo().search([('id', '=', int(id))])    for obj in subscribe_list:        obj.confirmed = True    kwargs = {"programs_id":programs_id,}    return self.subscribed_situation(**kwargs) #这个函数通过kwargs参数获取到数据再渲染出我们需要的页面

问题2:似乎通过搜索的到的原生数据类型,#原生的数据库记录好像不可以?会变成wens.investment...(43,)这样的类型而不是一个字符串,

最开始的mainControllers中的函数中的数据库操作:

project_model = http.request.env['wens.investment.programs'] #获得该数据表的modelproject_lists = project_model.sudo().search([('id', '=', id)])  # 获得id相同的记录for obj in project_lists:    data_list.append(obj)

到了html页面通过jinja2拿到的数据会变成  wens.investment...(43,)  这个奇怪的数据结构,

但是经我测试,用这种自己手动生成的字典:

data_list.append(    {        "io_users_id":obj.io_users_id,        "paid":obj.paid,        "id":obj.id,        "programs_id":programs_id,        "confirmed":obj.confirmed,        "money":obj.money,    })

就不会有这种问题。随后我进行了一个简单的测试,终于找到了问题的根源所在:

我们在mainControllers进行打印信息,测试代码如下:

data_list = []project_model = http.request.env['wens.investment.programs']project_lists = project_model.sudo().search([]) #查看所有项目记录for obj in project_lists:    data_list.append(        {'id': obj.id,         'name': obj.name,         'status': SELECT_OF_STATUS[obj.status],         'money_amount': obj.money_amount,         'start_date': obj.start_date,         'end_date': obj.end_date,         'peroid': obj.period,         'least_money': obj.least_money,         'max_money': obj.max_money,         'annual_return': obj.annual_return,         'description': obj.description,         }    )    print "this is program_list,看看数据结构"    print obj    print type(obj)print "看完obj,看看字典对象"print data_list[0]print type (data_list[0])

输出结果大致如下:

this is program_list,看看数据结构wens.investment.programs(39,)<class 'odoo.api.wens.investment.programs'>this is program_list,看看数据结构wens.investment.programs(42,)<class 'odoo.api.wens.investment.programs'>this is program_list,看看数据结构wens.investment.programs(43,)<class 'odoo.api.wens.investment.programs'>this is program_list,看看数据结构wens.investment.programs(59,)<class 'odoo.api.wens.investment.programs'>this is program_list,看看数据结构wens.investment.programs(62,)<class 'odoo.api.wens.investment.programs'>看完obj,看看字典对象{'status': '\xe6\x9c\xaa\xe5\xbc\x80\xe5\xa7\x8b', 'max_money': 500000, 'description': u'\u5065\u5eb7\uff0c\u4ece\u5927\u4fdd\u5065\u505a\u8d77', 'end_date': '2017-08-01', 'peroid': u'2\u5e74', 'money_amount': 2000000, 'id': 39, 'name': u'kk\u4e0d\u9508\u94a21112223', 'annual_return': 0.3, 'least_money': 20000, 'start_date': '2017-08-01'}<type 'dict'>

最后发现的结果就是,从数据库中search得到的数组,里面存储的数据结构是一个对象,它是由 'odoo.api.wens.investment.programs' 类生成的,

而我们自己手动生成的自然是字典对象了,所以尽可能地自己手动专成dict对象吧!

进入odoo/api.py中可以看到一些注释:

""" This module provides the elements for managing two different API styles,    namely the "traditional" and "record" styles.    In the "traditional" style, parameters like the database cursor, user id,    context dictionary and record ids (usually denoted as ``cr``, ``uid``,    ``context``, ``ids``) are passed explicitly to all methods. In the "record"    style, those parameters are hidden into model instances, which gives it a    more object-oriented feel.    For instance, the statements::        model = self.pool.get(MODEL)        ids = model.search(cr, uid, DOMAIN, context=context)        for rec in model.browse(cr, uid, ids, context=context):            print rec.name        model.write(cr, uid, ids, VALUES, context=context)    may also be written as::        env = Environment(cr, uid, context) # cr, uid, context wrapped in env        model = env[MODEL]                  # retrieve an instance of MODEL        recs = model.search(DOMAIN)         # search returns a recordset        for rec in recs:                    # iterate over the records            print rec.name        recs.write(VALUES)                  # update all records in recs    Methods written in the "traditional" style are automatically decorated,    following some heuristics based on parameter names."""

这里的“recrod” style不就是我们平日开发所用的对数据库进行操作的api吗!在下大胆地猜测这是模块可以动态的生成像wens.investment.programs这样的对数据库的表进行操作的类,(因为我在这里看到了Metaclass这个关键词)。再详细的只能放在以后研究了,毕竟要投入开发工作。


问题3:看到一个师兄的代码中,一个json的用法:

result['isSuccess'] =True

result['remark'] ='认购成功'

return json.dumps(result)

这是什么意思?而且它是如何实现页面跳转的呢?


解决方法:  dumps自己去百度

至于实现页面跳转,才发现原来同组的师兄用的是javascript控制了一部分逻辑,然后再实现了跳转,也就是说,同样地需要进行了数据库操作之后跳入回某个页面,我用的是python后台(见问题1),而师兄用的是javascript。javascript代码如下:

var $$ = Dom7$$('#subscribe').on('click', function(){    var formData = myApp.formToJSON('#subscribe-form'); //获取表单    var subscribe_money = formData.subscribe_money;  //表单的这一项内容    var least_money = parseInt($('#least_money').text());    var max_money = parseInt($('#max_money').text());    if(subscribe_money == "" || subscribe_money == undefined || subscribe_money == null){        myApp.alert('请输入认购金额','注意')    }else {        subscribe_money = parseInt(subscribe_money)        if(subscribe_money < least_money){  //异常提示            myApp.alert('认购金额不得低于'+least_money,'注意')        }else if(subscribe_money > max_money){            myApp.alert('认购金额不得高于'+max_money,'注意')        }else {            var user_name = $('#user_name').text()            var program_name = $('#program_name').text()            $.ajax({                async: false,  //是否异步处理,默认true                timeout: 3000, //设置本地的请求超时时间(以毫秒计)                type: "post", //规定请求的类型(GET 或 POST)                url: "/wens_investment/subscribe_action", //规定发送请求的 URL。默认是当前页面。                data: { //规定要发送到服务器的数据。                    user_name: user_name,                    program_name: program_name,                    subscribe_money: subscribe_money,                },                dataType: "json", //预期的服务器响应的数据类型。                success: function(data){ //当请求成功时运行的函数。data是服务器返回的参数                    console.log(data)                    if (data.isSuccess){                        warmingFrame('提示',data.remark)                        closeWarmingFrame(1000)                        mainView.router.loadPage('/wens_investment/user_index’)//loading pages using javascript in framework7//参考http://docs.framework7.cn/Index/pages_ajax.html#load-pages-using-javascript                    }else {                        myApp.alert(data.remark,'注意')                    }                },                error: function(e) { //如果请求失败要运行的函数。                    console.log('error')                }            })        }    }});

原来, $.ajax()jQuery中提供的执行异步http请求的方法,可参考。http://www.runoob.com/jquery/ajax-ajax.html

从中额外了解到的一点就是,在我们对用户输入的数据进行合法性检验时,可以用javascript,例如如上代码,它可以给用户提示——但是这不是绝对的,因为用户可以在网页中修改网页源代码,跳过js的约束,所以真正有效的检验数据合法是要在后台进行过滤的。