Dgrid和Django Rest框架(JsonRest)

时间:2015-06-01 16:45:41

标签: python django dojo dgrid jsonreststore

6.30.15 - 我如何使这个问题更好,更有益于其他人?反馈会有所帮助。谢谢!

我正在使用dojo的dgrid创建一个ondemand网格。我无法连接到商店。我可以显示列标题,但我无法在此处显示任何数据是我正在使用的代码。一些数据因机密性而改变。任何帮助将不胜感激。 Json正在从Django Rest Framework api中撤出。

product {
  "data": [
    {
      "productID": 1,
      "isSelected": true
    },
    {
      "productID": 10,
      "isSelected": true
    },
    {
      "productID": 27,
      "isSelected": false
    },
    {
      "productID": 28,
      "isSelected": false
    },
    {
      "productID": 29,
      "isSelected": false
    },
    {
      "productID": 35,
      "isSelected": false
    }
  ]
}   
object {Newtonsoft.Json.Linq.JObject}

更新 - dstore / Rest应用 - 仍然无法提取数据。现在列标题也不显示...

    <!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>Dgrid Test</title>
    <link a ref
</head>
<body>

     <div id="grid"></div>
    <script src="/static/web/dojo/dojo.js"
        data-dojo-config="async: true"></script>


    <script>
        require([
            'dojo/_base/declare',
            'dojo/data/ObjectStore',
            'dojo/store/JsonRest',
            'dojo/store/Memory',
            'dgrid/OnDemandGrid',
            'dojo/domReady!'], function (declare, ObjectStore, Memory, JsonRest, OnDemandGrid) {


    var grid = new OnDemandGrid({
        collection: new dojo.store.JsonRest({target:"/api/storeName/"}),
        columns: {
            id: 'ID',
            column1: 'column1',
            column2: 'column2',
            column3: 'column3',
            column4: 'column4',
            column5:'column5',
            column6:'column6',
            column7:'column7',
            column8: 'column8'
        }
    }, 'grid');

    grid.startup();
});
    </script>

更新6.2.15

这是我今天早上一直在努力修改的代码。以下是Firebug中出现的错误: TypeError:transform(...)为null return transform(value,key).toString(); instrum ... tion.js(第20行)

这真的没有任何意义。我不知道该错误是否使数据与实际显示的数据保持一致。无论我做什么,都不会显示。明天将在这两件事情上工作两周。编程的乐趣。 :)

以下是代码:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>Dgrid Test</title>

</head>
<body>

     <div id="grid"></div>
    <script src="/static/web_ui/dojo/dojo.js"
        data-dojo-config="async: true"></script>

    <script>
        require([
            'dojo/_base/declare',
            'dojo/dom',
            'dojo/on',
            'dstore/Rest',
            'dgrid/OnDemandGrid',
            'dojo/domReady!' 
], function (declare, dom, on, Rest, OnDemandGrid) {
    // Create an instance of OnDemandGrid referencing the store
    var store = new Rest({ target:"/api/apiname/" });

    });
     var grid = new OnDemandGrid({
        collection: store,
        columns: {
            column1: 'column1',
            column2: 'column2',
            column3: 'column3',
            column4: 'column4',
            column5:'column5',
            column6:'column6',
            column7:'column7',
            column8: 'column8'
        }
    }, 'grid');

    grid.startup();

如果您单击错误中的链接,这是代码。 网格本身显示在浏览器中;按钮,列标题......一切......只是没有数据。在终端(服务器信息):显示: [02 / Jun / 2015 13:38:18]“GET / api / XXXXXXXXX /?format = json&amp; limit(25)HTTP / 1.1”200 1631 [02 / Jun / 2015 13:38:18]“GET / api / XXXXXX /?format = json&amp; limit(10)HTTP / 1.1”200 1631

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>Dgrid Test</title>

</head>
<body>

<h1>Demo: Single-Query Mixin</h1>
    <form id="queryForm">
        <label for="lastField">Blank Blank contains:</label>
        <input id="lastField" name="blank_type">
        <button type="submit">Filter</button>
        <button type="reset">Reset</button>
    </form>

     <div id="grid"></div>
    <script src="/static/web_ui/dojo/dojo.js"
        data-dojo-config="async: true"></script>

    <script>
        require([
            'dojo/_base/declare',
            'dojo/dom',
            'dojo/on',
            'dstore/Rest',
            'dstore/Request',
            //'dstore/RequestMemory',
            'dgrid/extensions/Pagination',
            'dgrid/OnDemandGrid',
            'dstore/Trackable',
            'dojo/domReady!'
], function (declare, dom, on, Rest, Request, Pagination, OnDemandGrid, Trackable) {
    // Create an instance of OnDemandGrid referencing the store
    var data = [];
    for (var i = 0; i < 100; i++) {
        data[i] = {
            id: i + 1,
            name: '' + (i + 1),
            value: i + 1
        };
    }

     var store = new (declare([Rest, Trackable]))({ 
        target:'http://localhost:8000/api/XXXXXXXXX/?format=json',
        range:items=0-25,
        idProperty: 'id',
        data: data
     });


     var grid = new (declare([OnDemandGrid, Pagination]))({
        collection: store,
        columns: [
            {label:"ID", field:"id"},
            {label:"XXXXXXXXX", field:"XXXXXXXXX"},
            {label:"XXXXXXXXX", field:"XXXXXXXXX"},
            {label:"XXXXXXXXX", field:"XXXXXXXXX"},
            {label:"XXXXXXXXX", field:"XXXXXXXXX"},
            {label:"XXXXXXXXX", field:"XXXXXXXXX"},
            {label:"XXXXXXXXX", field:"XXXXXXXXX"},
            {label:"XXXXXXXXX", field:"XXXXXXXXX"},
            {label:"XXXXXXXXX", field:"XXXXXXXXX"}
        ]
    }, 'grid');


 grid.startup(); 


});
    </script>

</body>
</html>

更新6.3.15 以下是尝试创建自定义商店以满足要求的新代码

//  |       }
    //  |   );

    thisObject = thisObject || kernel.global;
    transform = transform ?
        lang.hitch(thisObject, transform) : function(v){ return v; };

    return template.replace(/\$\{([^\s\:\}]+)(?:\:([^\s\:\}]+))?\}/g,
        function(match, key, format){
            var value = lang.getObject(key, false, map);
            if(format){
                value = lang.getObject(format, false, thisObject).call(thisObject, value, key);
            }
            return transform(value, key).toString();
        }); // String
};

string.trim = String.prototype.trim ?
    lang.trim : // aliasing to the native function
    function(str){
        str = str.replace(/^\s+/, '');
        for(var i = str.length - 1; i >= 0; i--){
            if(/\S/.test(str.charAt(i))){
                str = str.substring(0, i + 1);
                break;
            }
        }
        return str;
    };

2 个答案:

答案 0 :(得分:0)

这个问题已经开始变形了,所以我把我的答案格式化了一下,试图匹配,所以它仍然有点凝聚力。

问题1:dgrid版本与正在使用的商店API

dgrid 0.4与stark商店接口,而不是dojo/store,这就是为什么你最终没有显示数据。

dstore/Rest应该可以作为dojo/store/JsonRest的主要替代品使用,但您可能希望摆弄一些从请求继承的dstore

如果您之前来自dgrid 0.3,options会有一个涵盖商店API更改的部分。还为dgrid 0.4和dstore更新了migration guide教程。

问题2:服务器返回的数据格式

dstore/Rest对其连接的服务有特定的期望。关于这个问题突然出现了另一个问题,所以我得到了关于细节的答案Using Grids and Stores

问题3:“transform(...)为null返回变换(value,key).toString();”

这听起来与原始问题大致相同,但最常见的原因是通过${...}引用属性的小部件模板,小部件中实际上并不存在。

答案 1 :(得分:0)

我已经在这个Dojo / Django问题上四处走动了近一个月了。问题是Django Rest Framework API和dojo / dgrid分页之间的兼容性问题。我收到了来自Sitepen的Ken Franqueiro和Dylan的一些很棒的帮助。与他们来回交谈(并加剧了他们,我确定......)他们帮我确定了几件事。

Dgrid 0.3最适合Dojo / store - Dgrid 0.4最适合dstore。但是为了使它能够与Django Rest Framework一起正常工作 - 必须在settings.py中的Django Rest Framework设置中设置Limit / Offset Pagination。

{{1}}

Ken还建议我必须创建一个自定义商店才能让它完全运行。在实现分页设置后,使用Dojo 1.8和dgrid 0.3.0(dojo / store / JsonRest和request)工作正常。

在完成这个问题的三个星期(和一天)之后,我非常感激地说数据显示在dgrid中,我可以继续下一步。非常感谢Ken和Dylan的帮助(和耐心)! :)