отображение всех полей в таблице данных Dojo с помощью dojo.store.JsonRest

#django #json #dojo

#django #json #dojo

Вопрос:

У меня есть таблица данных Dojo для отображения контактной информации, в которой отображаются значения только для двух столбцов: «модель» и «пк». Остальные столбцы пусты, вероятно, потому, что ответ JSON от сервера помещает другие пары имя / значение внутри «полей»:

 [{"pk": 1, "model": "accounting.contacts", "fields": {"mail_name": "Andy", "city": "Grand Rapids", "zip": "49546", "country": "US", "state": "MI"}}]
  

Каков наилучший способ отобразить все мои поля в таблице?

Вот соответствующий вид в Django:

 def contacts(request):  
    json_serializer = serializers.get_serializer("json")()  
    json_contacts = json_serializer.serialize(Contacts.objects.all(),    ensure_ascii=False)  
    return HttpResponse(json_contacts, mimetype="application/json")  
  

И вот моя страница Dojo:

 <script src="http://ajax.googleapis.com/ajax/libs/dojo/1.6/dojo/dojo.xd.js"
    data-dojo-config="isDebug: true,parseOnLoad: true">
</script>
<script type="text/javascript">
    dojo.require("dojo.store.JsonRest");
    dojo.require("dojox.grid.DataGrid");
dojo.require("dojo.data.ObjectStore");

    dojo.ready(function(){
        objectStore = new dojo.store.JsonRest({target:"/contacts/"});
        //alert(objectStore);
        dataStore = new dojo.data.ObjectStore({objectStore: objectStore});

        //alert(dataStore);

        layoutGridContacts = [{
            field: 'mail_name',
            name: 'Name',
            width: '200px'
        },
        {
            field: 'model',
            name: 'DB Table',
            width: '100px'
                    ...

        }];

        gridContacts = new dojox.grid.DataGrid({
            query: {
                name: '*'
            },
            store: dataStore,
            clientSort: true,
            structure: layoutGridContacts
        }, dojo.byId("containerGridContacts"));

        gridContacts.startup();
    });
</script>
    <link rel="stylesheet" type="text/css" href="http://ajax.googleapis.com/ajax/libs/dojo/1.6/dijit/themes/claro/claro.css" />

    <style type="text/css">
        @import "http://ajax.googleapis.com/ajax/libs/dojo/1.6/dojox/grid/resources/Grid.css";
        @import "http://ajax.googleapis.com/ajax/libs/dojo/1.6/dojox/grid/resources/claroGrid.css";
        .dojoxGrid table {margin: 0; } html, body { width: 100%; height: 100%;
        margin: 0;}         
    </style>
</head>

<body class="claro">
    <div id="containerGridContacts" style="width: 100%, height: 100%;">
    </div>
</body>
  

Спасибо.

Ответ №1:

На самом деле это вопрос о том, «Как мне взаимодействовать с объектом javascript?» Учитывая JSON в вашем вопросе и предполагая, что вы присвоили его переменной obj , вы могли бы получить доступ mail_name с obj[0]['fields']['mail_name'] или используя точечную нотацию, obj[0].fields.mail_name . Я не использовал Dojo, но держу пари, вам просто нужно установить fields.mail_name как field в layoutGridContacts .

Комментарии:

1. Спасибо за советы. К сожалению, хранилище Dojo, похоже, не может взаимодействовать с JSON, используя любой из этих методов.

Ответ №2:

Я смог заставить сервер выдавать ответ JSON, который не содержит вложенных объектов, поэтому хранилище Dojo смогло его использовать. Для этого я изменил свой вид на:

 def contacts(request):  
    all_contacts = list(iter(Contacts.objects.values()))  
    json_contacts = simplejson.dumps(all_contacts)  
    return HttpResponse(json_contacts, mimetype="application/json")  
  

Ответ №3:

Используйте «fields.» перед вашим идентификатором поля, чтобы получить доступ к свойствам внутри полей:

 layoutGridContacts = [{
        field: 'fields.mail_name',
        name: 'Name',
        width: '200px'
    },
   ...
  

Ответ №4:

Вы можете использовать метод форматирования для извлечения данных. Для вашего примера это будет что-то вроде приведенного ниже

 {name:"Name", 
 field: "fields", 
 width: "20%", 
 cellStyles:"background-color:#e3690b;",
 formatter: function(field){ 
             if(!field){return;}
       return field.mail_name;
 }
}