从模板odoo 8调用python函数

时间:2016-08-19 07:03:24

标签: templates controller web odoo-8 qweb

我的控制器类中有一个函数,我需要在我的一个模板中调用该函数。我试过这个:

controller.py

class MyController(http.Controller):
    @http.route(["/myPath/"], type='http', auth="public", website=True)
    def myfucntion(self):
        -- something ---
    def thisMethod(self):
        I need to call this methd in remplate

TEMPLATE.XML

<t t-esc="thisMethod()"/>

获取错误:

 QWebException: "'NoneType' object is not callable" while evaluating

thiMethod()

如何调用此方法?

1 个答案:

答案 0 :(得分:0)

据我了解,您实际上并没有使用t-esc语法从模板中调用该方法。您可以做的是在控制器中创建可通过post或get请求访问的方法。如果您愿意,可以使用javascript通过模板发出这些请求,或者通过标记在模板中包含javascript文件。如果脚本很简单,你可能会使用内联javascript

  <script>console.log("Hello World")</script> 

否则,您可以像这样指向静态目录中的js文件。

  <script src="/<module>/static/main.js"></script>
然而,Odoo有一些包含js的规则。如果您使用Odoo CMS作为Qweb模板的父模板,那么您可能还希望使用xpath将js文件与其余所有Odoo的js文件放在一起。

  <template id="my_js" inherit_id="website.assets_frontend" name="My Js">
      <xpath expr="script[last()]" position="after">
          <script type="text/javascript" src="/<module>/static/main.js" />
      </xpath>
  </template>

在Odoo9中,事情变得(可能)更复杂,因为你需要使用require js语法在你的js中使用post请求。这是一个过于简单的例子,应该在Odoo8中工作。对于Odoo9,请查看使用require js的其他示例的代码。

这是一些控制器方法,一个是json,另一个是http。将代码放在适合您的代码中。您可以选择返回更合适的内容(如某些数据)但True或False表示成功或失败可能就足够了。

    @http.route('/test/json/method/', auth='none', type='json', website=True)
    def test_json(self):
        #YOUR CODE HERE 
        return json.dumps({'json':True})

    @http.route('/test/http/method/', auth='none', type='http', website=True)
    def test_http(self):
        #YOUR CODE HERE
        return json.dumps({'http':True})

使用上述方法之一(简要地)将此javascript放置在模板中调用该方法。

        <script>
        jQuery.get('/test/http/method/',function(data){ console.log( "HTTP RESPONSE: " + data ) });
        </script>
        <script>
    jQuery.ajax({
        type: "POST",
        url: '/test/json/method/',
        dataType: 'json',
        async: true,
        data: JSON.stringify({}),
        contentType: "application/json; charset=utf-8",
        success: function ( data ) {
           console.log( "JSON RESPONSE: " + JSON.stringify( data ) );
        },
        failure: function( data ){
           console.log( JSON.stringify( data ) );
        }
    })
    </script>

在Odoo中进行路由时需要学习很多东西。存在安全问题,权限问题,您应该小心。

https://www.odoo.com/documentation/8.0/howtos/website.html讨论了一些概念的快速概述。 https://www.odoo.com/documentation/8.0/reference/http.html讨论控制器。 https://www.odoo.com/documentation/8.0/reference/javascript.html涵盖了javascript。除此之外,请查看网页,控制器目录中的网站插件以获取更多示例。