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