Dgrid и Django Rest Framework (JsonRest)

6.30.15 - КАК Я МОГУ СДЕЛАТЬ ЭТОТ ВОПРОС ЛУЧШЕ И ПОЛЕЗНЕЕ ДЛЯ ДРУГИХ? ОТЗЫВ БУДЕТ ПОЛЕЗЕН. СПАСИБО!

Я создаю сетку по запросу, используя dgrid dojo. У меня проблемы с подключением к магазину. Я могу отобразить заголовки столбцов, но не могу отобразить какие-либо данные, вот код, который я использую. Некоторые данные изменены в целях конфиденциальности. Будем очень благодарны любой помощи. Json извлекается из API Django Rest Framework.

    <!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>

ОБНОВЛЕНИЕ - применяется dstore/Rest - по-прежнему не удается извлечь данные. Теперь заголовки столбцов также не отображаются...

<!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();

ОБНОВЛЕНИЕ 6.2.15

Вот пересмотренный код, над которым я работал сегодня утром. Вот ошибка, возникающая в Firebug: TypeError: transform(...) is null return transform(value, key).toString(); инструмент...tion.js (строка 20)

Это действительно не имеет никакого смысла. Я не знаю, мешает ли эта ошибка отображать данные или нет. Что бы я ни делал, он не отображается. Завтра будет две недели работы над этой вещью. Радости программирования. :)

А вот код:

<!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>

Это код, если вы нажмете ссылку в ошибке. Сама сетка отображается в браузере; кнопки, заголовки столбцов... все... просто нет данных. И в терминале (информация о сервере): это отображает: [02/Jun/2015 13:38:18] "GET /api/XXXXXXXXX/?format=json&limit(25) HTTP/1.1" 200 1631 [02/ июнь 2015 г., 13:38:18] "GET /api/XXXXXX/?format=json&limit(10) HTTP/1.1" 200 1631

//  |       }
    //  |   );

    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;
    };

ОБНОВЛЕНИЕ 6.3.15 Вот новый код, пытающийся создать собственный магазин для удовлетворения требований.

  <script>
        define([
            'dojo/_base/lang',
            'dojo/_base/declare',
            'dojo/dom',
            'dojo/on',
            'dstore/Store',
            'dojo/Request',
            'dojo/store/Observable',
            'dgrid/extensions/Pagination',
            'dgrid/OnDemandGrid',
            'dstore/QueryResults',
            'dojo/domReady!'
], function (lang, declare, dom, on, Store, Request, Observable, Pagination, OnDemandGrid, QueryResults) {
    // Create an instance of OnDemandGrid referencing the store

     return declare(Observable(Store, { 
        apiUrl:'http://localhost:8000/api/table/?format=json',
        headers: {
            Accept: 'application/json.rest_framework.v3+json'
        },
        'Content-Range':items=0-25/765,
        _request:function (target, options) {
            options = lang.mixin({ handleAs:'json'}, options);
            options.headers = lang.mixin({}, this.headers, options.headers);
            return request(this.apirUrl + target, options);
        },

        get: function (id) {
            return this._request('api/table/'+ encodeURIComponent(id),{
                method: 'GET'
            });
        },
        fetch: function(){
            return new QueryResults(this._request('/api/table'));
        }
     }));


     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>

person Johnson    schedule 01.06.2015    source источник
comment
Какая версия dgrid? (наверное 0,4?)   -  person Ken Franqueiro    schedule 01.06.2015
comment
да - это последняя версия.   -  person Johnson    schedule 01.06.2015
comment
Теперь это как бы превращается в другой вопрос. Наиболее распространенной причиной преобразования (...) является возврат null transform(value, key).toString(); ошибка возникает, если у вас есть шаблон виджета, который ссылается на свойство через ${...}, которого на самом деле не существует в вашем виджете. Однако это совершенно не связано с первоначальными проблемами, связанными с форматом данных, и вы до сих пор не включили пример того, как выглядит ответ данных вашей службы.   -  person Ken Franqueiro    schedule 02.06.2015


Ответы (2)


Этот вопрос начал трансформироваться, поэтому я немного отформатировал свой ответ, чтобы попытаться соответствовать, чтобы он все еще был несколько связным.

Проблема 1: версия dgrid по сравнению с используемым API хранилища

dgrid 0.4 взаимодействует с хранилищами dstore, а не с dojo/store, поэтому данные не отображаются. .

dstore/Rest можно использовать в основном в качестве замены dojo/store/JsonRest, хотя вы можете повозиться с некоторыми из параметры, которые он наследует от Request.

Если вы ранее использовали dgrid 0.3, руководство по миграции содержит раздел, посвященный изменению API магазина. Учебник Использование сетей и хранилищ также был обновлен для dgrid 0.4 и dstore.

Проблема 2: Формат данных, возвращаемый сервером

dstore/Rest предъявляет особые требования к службам, к которым он подключается для работы. По этому поводу возник еще один вопрос, поэтому у меня есть ответ здесь относительно деталей.

Проблема 3: "transform(...) is null return transform(value, key).toString();"

Это звучит в значительной степени косвенно по отношению к исходной проблеме, но наиболее распространенной причиной является шаблон виджета, который ссылается на свойство через ${...}, которого на самом деле не существует в виджете.

person Ken Franqueiro    schedule 01.06.2015
comment
Большой! Я попробую это прямо сейчас и посмотрю, смогу ли я заставить его работать. Большое спасибо!!! Я работаю над этим уже больше недели! - person Johnson; 01.06.2015
comment
Что ж, я провел дополнительное исследование dstore, Rest, RequestMemory и некоторых других, но все еще не могу заставить его работать. Я смотрел и просматривал учебники. Есть ли что-нибудь еще, что вы могли бы предложить? - person Johnson; 01.06.2015
comment
для всех интенсивных целей похоже, что он должен работать, но он все еще не работает. Есть ли что-нибудь еще, что я мог бы попробовать? Я изучил множество документации и руководств по dstore. И из того, что я могу сказать, мой код ДОЛЖЕН работать.... - person Johnson; 01.06.2015
comment
Кажется, вы заканчиваете свой обратный вызов require довольно рано (до var grid = ..., что, вероятно, является ошибкой... - person Ken Franqueiro; 02.06.2015
comment
Я это тоже видел и исправил. :) Спасибо. Я почти понял. Данные подтягиваются, отладчиком видно, но все равно не отображается. Это самая странная вещь... надеясь прибить эту вещь сегодня. - person Johnson; 02.06.2015
comment
Можете ли вы привести пример того, как выглядит ответ (изменение значений, если вам нужно, чтобы опубликовать здесь)? - person Ken Franqueiro; 02.06.2015
comment
Да, минутку... Я хожу по кругу... Я опубликую обновление в поле выше. - person Johnson; 02.06.2015
comment
Я прочитал ваш другой комментарий по другому вопросу и начал пытаться делать именно так, как вы сказали. Попытка создать собственный магазин, чтобы удовлетворить все потребности. Все еще не работает, но хотел бы получить обратную связь, чтобы увидеть, на правильном ли я пути... - person Johnson; 03.06.2015
comment
Я отключил наблюдаемый магазин додзё и переключился на отслеживаемый dstore. - person Johnson; 03.06.2015

Я ходил вокруг да около с этой проблемой Dojo/Django уже почти месяц. Проблемой выпуска была проблема совместимости между Django Rest Framework API и разбиением на страницы dojo/dgrid. Мне очень помогли Кен Франкейро и Дилан из Sitepen. Поговорив с ними туда-сюда (и, я уверен, разозлив их... :) Они помогли мне определить несколько вещей.

Dgrid 0.3 лучше всего работает с Dojo/store, а Dgrid 0.4 лучше всего работает с dstore. Однако для того, чтобы он правильно работал с Django Rest Framework, необходимо установить Limit/Offset Pagination в настройках Django Rest Framework в settings.py.

# Django REST Framework configuration overrides
REST_FRAMEWORK = {
    'DEFAULT_PERMISSION_CLASSES': ('rest_framework.permissions.IsAdminUser',),
    'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.LimitOffsetPagination'

}

Кен также предположил, что мне придется создать собственный магазин, чтобы заставить его работать полностью. Использование Dojo 1.8 и dgrid 0.3.0 (dojo/store/JsonRest и request) работало нормально после реализации настроек нумерации страниц.

После трех долгих недель (и одного дня) работы над этой одной проблемой я ОЧЕНЬ благодарен за то, что данные отображаются в dgrid, и я могу перейти к следующему. Большое спасибо Кену и Дилану за их помощь (и терпение)! :)

person Johnson    schedule 11.06.2015