【问题标题】:Accessing pyramid views using knockout js使用淘汰赛 js 访问金字塔视图
【发布时间】:2026-01-18 05:25:01
【问题描述】:

我在 Pyramid 中有这个 delete 视图,我正在使用 ma​​ko 模板和 knockout js .

config.add_route('delete', '/delete/{id}')

这是我在金字塔中查看delete 的路线。我想将模板中的一些按钮绑定到这个 url,以便它调用 delete 视图。

我试过这样做:

<script>
this.delete = function(detail){

  $.post(
      "${request.route_url('delete', id=detail['id'])}",
      {'action' : 'delete', 'id' : detail.id()},
      function(response){

          //remove the currently selected detail from the array
          self.details.remove(detail);
      }
  );
};

但是,这会返回以下 traceback

TypeError: 'Undefined' object has no attribute '__getitem__'
  1. 这样做的正确方法是什么?
  2. delete 视图将location 设置为当前页面。那么有没有办法在不刷新当前页面的情况下做到这一点?

【问题讨论】:

    标签: javascript python knockout.js pyramid mako


    【解决方案1】:

    ${request.route_url('delete', id=detail['id'])} 是 python/mako 代码,而不是 javascript 代码。如果您的 ID 是 99,它最终应该以delete/99 呈现为 html。

    您在 python 中收到 TypeError,因为在名为 detail 的模板命名空间中没有对象/变量。也许这是因为您在将参数传递给 mako 时将其称为记录或其他什么?你没有提供足够的信息让我告诉...

    如果您将detail={id:99} 传递给mako,那么${request.route_url('delete', id=detail['id'])} 将起作用。如果 detail 是一个对象,那么detail.id 会更合适。

    除此之外,您最好像这样在 in mako 中定义一个 javascript 对象(假设我已将一个对象作为变量 'mako_object' 传递给 mako);

    var my_object = {
        id: ${mako_object.id},
        delete_url: "${request.route_url('delete', id=mako_object.id)}",
    }
    

    因此html看起来像;

    var my_object = {
        id: 99,
        delete_url: "/delete/99",
    }
    

    【讨论】:

      【解决方案2】:

      好的,我得到了答案。我正在为未来的 Google 员工添加此内容。

      knockout 模型中,这些值必须可观察为 ko.observable('&lt;some_value&gt;'),以便在不刷新的情况下更新它们。

      链接应该是delete/&lt;some_id&gt;。因此,将 json 对象中的字符串 "delete/"id 连接为:

      var delete_link = "delete/".concat(detail.id);

      然后使用delete函数如下:

      this.delete = function(detail){
         var delete_link = "delete/".concat(detail.id);
         $.post(
            delete_link,
            {'action' : 'delete', 'id' : detail['id']},
            function(response){
                self.details.remove(detail);
                }   
             );
      };
      

      【讨论】: