В настоящее время я пытаюсь отправить значения двух раскрывающихся списков в представление django. Мой код работал бы правильно, если бы выпадающие списки были независимыми. Проблема в том, что это не так. Первый обновляет второй, поэтому мне нужно сделать мой AJAX почтовый запрос после обновления второго выпадающего списка.
Вот мой текущий html / Javascript код:
<select name="d1" class="toChange">
{% for item in items1 %}
<option val="{{ item }}"> {{ item }} </option>
{% endfor %}
</select>
<select name="d2">
{% for item in items2 %}
<option val="{{ item }}"> {{ item }} </option>
{% endfor %}
</select>
<script type="text/javascript">
function dropdownChange () {
var value_d1 = $(".toChange option:selected").val();
var value_d2 = $("select[name=d2] option:selected").val();
$.ajax({
url: '/myApp/templates/',
type: 'POST',
data: {'d1': value_d1, 'd2': value_d2},
success: function(data) {
var str = '';
data.forEach(function(opt){
str += '<option value="' + opt + '">' + opt + '</option>';
});
document.getElementById("d2").innerHTML = str;
}
});
$(".toChange").change(dropdownChange);
Итак, здесь изменение в d1 обновляет d2, но вызов AJAX выполняется до того, как d2 обновляется и поэтому отправляет неправильное значение на мой взгляд. Как я могу преодолеть эту проблему?
ОБНОВЛЕНИЕ: добавление кода, предложенного TM.96
<select id="d1" name="d1" class="toChange">
{% for item in items1 %}
<option val="{{ item }}"> {{ item }} </option>
{% endfor %}
</select>
<select id="d2" name="d2">
{% for item in items2 %}
<option val="{{ item }}"> {{ item }} </option>
{% endfor %}
</select>
<script type="text/javascript">
let select1 = document.getElementById('d1');
let select2 = document.getElementById('d2');
function onChangeSelect1() {
window.select2.value = window.select1.options[window.select1.selectedIndex].value;
onChangeSelect2();
}
function onChangeSelect2() {
console.log('Value of Select 1: ' + window.select1.value);
console.log('Value of Select 2: ' + window.select2.value);
$.ajax({
url: '/myApp/templates/',
type: 'POST',
data: {'d1': select1, 'd2': select2},
success: function(data) {
var str = '';
data.forEach(function(opt){
str += '<option value="' + opt + '">' + opt + '</option>';
});
document.getElementById("d2").innerHTML = str;
}
});
}
$(".toChange").change(dropdownChange);
</script>
ОБНОВЛЕНИЕ 2:
def MyView(request):
if request.method == 'POST' and request.is_ajax:
result_r = request.POST.get('d1')
result_d = request.POST.get('d2')
query_results = data_immo.objects.all()
regions = data_immo.objects.values_list("nom_reg", flat=True).distinct().order_by('nom_reg')
departments = data_immo.objects.values_list("insee_dep").filter(Q(nom_reg=result_r)).distinct()
cities = data_immo.objects.values_list("nom_com").filter(Q(insee_dep=result_d)).distinct()
print(departments)
query_results_dict = {
'query_results': query_results,
'regions': regions,
'departments': departments,
'reg': result_r
}
departmentsVar=[]
for item in departments:
item = int(item[0])
departmentsVar.append(item)
departmentsVar.sort()
departmentsVar = json.dumps(departmentsVar)
citiesVar=[]
for item in cities:
citiesVar.append(item)
citiesVar.sort()
citiesVar = json.dumps(citiesVar)
return HttpResponse(departmentsVar, content_type='application/json')
Технически, мне нужно вернуться оба отдела Var и города Var, но по некоторым причинам мои попытки потерпели неудачу. Кажется, что я могу вернуть только одну переменную (так что отделаVar). Я попытался добавить два в словарь, но это не сработало.