Имеется форма с двумя выпадающими списками и одной кнопкой. По нажатию на кнопку отправляются данные в виде json, на основе этих данных выполняется фильтрация, потом отфильтрованные данные возвращаются на клиент. Однако, вместо отфильтрованных данных, выводится ошибка 500 (Internal Server Error). В трейсбек выводиться следующее: string indices must be integers. Как исправить данную ошибку?
Представление:
function GetSelectValue() {
var select_type = document.getElementById("type");
var type = select_type.value;
var select_net = document.getElementById("net");
var net = select_net.value;
var filter = JSON.stringify({type:type, net:net});
return filter
}
$(function () {
$("#btn1").click(function () {
var filter = GetSelectValue();
console.log(filter);
$.ajax({
type: "GET",
dataType: 'json',
url: '/map/filter/',
data: {
'filter': filter
},
success:
function (stations) {
pointLayer.removeAll();
draw_point_layer(stations);
},
error: function (xhr, status, error) {
console.log(error);
}
})
});
});
<body>
<div name="infoDiv" id="infoDiv" class="esri-widget">
<!--<b>Filter by geometry</b><br/><br/>-->
<label for="net">Сеть:</label>
<select id="net" class="options">
<option value="INTERMAGNET">INTERMAGNET</option>
<option value="IMAGE">IMAGE</option>
<option value="EISCAT">EISCAT</option>
<option value="MACCS">MACCS</option>
<option value="CARISMA">CARISMA</option>
<option value="CANMOS">CANMOS</option>
<option value="AUTUMNX">AUTUMNX</option>
<option value="USGS">USGS</option>
<option value="AMN">AMN</option>
<option value="DTU">DTU</option>
<option value="ENIGMA">ENIGMA</option>
<option value="EMMA/PLASMON">EMMA/PLASMON</option>
<option value="Japan Meteorological Agency">Japan Meteorological Agency</option>
<option value="GFZ">GFZ</option>
<option value="Italian Magnetic Network">Italian Magnetic Network</option>
<option value="Mid-continent Magnetoseismic Chain">Mid-continent Magnetoseismic Chain</option>
<option value="Russian Arctic and Antarctic Magnetometer">Russian Arctic and Antarctic Magnetometer</option>
<option value="Finnish Meteorological Institute">Finnish Meteorological Institute</option>
<option value="Swedish Institute of Space Physics">Swedish Institute of Space Physics</option>
<option value="BAS">BAS</option>
<option value="Российско-украинский сегмент геомагнитных данных">Российско-украинский сегмент геомагнитных данных</option>
<option value="all" selected>все</option>
</select>
<label for="type">Тип:</label>
<select id="type" class="options">
<option value="station">станция</option>
<option value="observatory">обсерватория</option>
<option value="all" selected>все</option>
</select
><br/><br/>
<button id="btn1" class="esri-button" id="clearFilter" type="button">
Применить
</button>
</div>
</body>
views.py
from django.shortcuts import render
from django.views.generic import TemplateView
from .models import Station
from django.http import HttpResponse
from django.core import serializers
def filter(request):
if request.GET:
filter = request.GET.get('filter')
type = filter['type']
if type == 'all':
stations = serializers.serialize('json', Station.objects.all())
else:
stations = serializers.serialize('json', Station.objects.filter(type=type))
return HttpResponse(stations, content_type='application/json')
Избавился от данной ошибки, применив метод json.loads(). Измененный views.py будет выглядеть следующим образом
from django.shortcuts import render
from django.views.generic import TemplateView
from .models import Station
from django.http import HttpResponse
from django.core import serializers
import json
def filter(request):
if request.GET:
filter = request.GET.get('filter')
decoded_filter = json.loads(filter)
type = decoded_filter["type"]
if type == 'all':
stations = serializers.serialize('json', Station.objects.all())
else:
stations = serializers.serialize('json', Station.objects.filter(type=type))
return HttpResponse(stations, content_type='application/json')
Сборка персонального компьютера от Artline: умный выбор для современных пользователей