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 (...) является нулем return transform (value, key).toString (); instrum...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/Jun/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>

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(...) - нулевое возвращаемое transform (значение, ключ).toString();"

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

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

Dgrid 0.3 лучше всего работает с Dojo/store - Dgrid 0.4 лучше всего работает с dstore. Однако для правильной работы с Django Rest Framework необходимо настроить разбиение по пределу / смещению в настройках 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, и я могу перейти к следующему пункту. Большое спасибо Кену и Дилану за помощь (и терпение)!:)

Другие вопросы по тегам