#javascript #html #jquery #django #ajax
Вопрос:
Я хотел бы выбрать опцию в первом раскрывающемся списке «Выбор», и на основе выбранной опции ajax должен загрузить второй раскрывающийся список «Выбор», как это сделать?
Это мой код:
Модели:
class MaintenanceEquipment(models.Model):
equip_id = models.CharField(max_length=30, auto_created=False, primary_key=True)
line_nm = models.CharField(max_length=20, blank=True, null = True)
sequence = models.CharField(max_length=30, blank=True, null = True)
equip_model = models.CharField(max_length=30, blank=True, null = True)
def __str__(self):
return self.equip_id
Число просмотров:
from django.shortcuts import render
from maintenance.models import MaintenanceEquipment
def maintenanceIssueView(request):
equipment_list = MaintenanceEquipment.objects.all()
context = {'equipment_list':equipment_list}
return render(request, 'maintenance/maintenanceIssue.html', context)
def load_equipment(request):
if request.method == 'GET':
line = request.GET.get('line_nm')
equipment = MaintenanceEquipment.objects.filter(line_nm=line)
context = {'equipment': equipment}
return render(request, 'maintenance/maintenanceIssue.html', context)
url-адреса:
urlpatterns = [
path('maintenanceIssueView/', views.maintenanceIssueView, name="maintenanceIssueView"),
path('ajax/load_equipment/', views.load_equipment, name="ajax_load_equipment"),
]
maintenanceIssue.html:
<form method="POST" id="maintenanceForm" data-equipment-url="{% url 'ajax_load_equipment' %}" novalidate>
{% csrf_token %}
<div style="text-align:left;" class="container-fluid">
<div style="text-align:left;" class="form-row">
<div class="form-group col-md-6">
<label for="line_nm" style="font-size:medium;">Line</label>
<select class="form-control" id="line_nm" name="line_nm" >
{% for instance in equipment_list %}
<option id="{{ instance.line_nm }}" value="{{ instance.line_nm }}">{{ instance.line_nm }}</option>
{% endfor %}
</select>
</div>
<div class="form-group col-md-6">
<label for="sequence" style="font-size:medium;">Machine</label>
<select class="form-control" id="sequence" name="sequence">
{% for instance in equipment %}
<option value="{{ instance.sequence }}">{{ instance.sequence }}</option>
{% endfor %}
</select>
</div>
</div>
</div>
</form>
<script>
$("#line_nm").change(function () {
var url = $("#maintenanceForm").attr("data-equipment-url");
var line_nm = $(this).val();
$.ajax({
url: url,
data: {
'line_nm': line_nm
},
success: function (data) {
$("#sequence").html(data);
console.log(data);
}
});
});
</script>
Данные правильно отправляются в представление с помощью GET, это мой терминал:
[21/Сентябрь/2021 08:34:43] «ПОЛУЧИТЬ /техническое обслуживание/ajax/оборудование для загрузки/?line_nm=SMD-16 HTTP/1.1» 200 18644
Это результат работы консоли.войдите правильно:
<select class="form-control" id="sequence" name="sequence">
<option name = "sequence" value="470">LOADER1</option>
<option name = "sequence" value="471">PRINTER1</option>
<option name = "sequence" value="472">PRINTER2</option>
<option name = "sequence" value="473">CARRIER JIG UNLOADER </option>
<option name = "sequence" value="474">P-AOI</option>
<option name = "sequence" value="475">P-AOI NG BUFFER</option>
<option name = "sequence" value="476">SHUTTLE1</option>
<option name = "sequence" value="477">MOUNTER1</option>
<option name = "sequence" value="478">MOUNTER2</option>
<option name = "sequence" value="479">MOUNTER3</option>
<option name = "sequence" value="480">MOUNTER4</option>
</select>
Однако в моем html-файле «последовательность» отображается пустой, я пробовал так много вещей, но пока безуспешно.
Комментарии:
1.
$("#sequence").html(data)
устанавливает innerHTML данного элемента, но в вашем случае переменнаяdata
начинается с<select>
, поэтому вы устанавливаете<select>
внутри другого<select>
элемента, а не только<option>
элементы. В этом может быть проблема.2. «данные», которые я показываю выше, являются ожидаемым результатом, который был показан только в console.log(данные), но в html выберите значение, полученное из $(«#последовательность»).html(данные) пуст, я прав?
3. Привет , можешь попробовать вот так :
$("#sequence").replaceWith(data);
4. Привет, Свати, этот код загружает последовательность, но он создает другую форму внутри первой формы, есть ли способ избежать этого?
5. Если я правильно понимаю ваш пост, вы ищете зависимое выпадающее меню. Проверьте этот пост simpleisbetterthancomplex.com/tutorial/2018/01/29/…
Ответ №1:
Вот общая закономерность:
template.html
<!-- first select populated with context variables -->
<select id='first-select'>
{% for instance in instances %}
<option value="{{ instance.id}}">
{{ instance.text }}
</option>
{% endfor %}
</select>
<!-- second select populated with response from ajax -->
<select id='second-select'></select>
script.js
$('#first-select').change(function() {
// send ajax request when the first select is changed:
$.ajax({
url : 'the-url',
type : 'POST',
data : {
instanceID : $(this).val()
},
success : function(response) {
// this function executes on receiving a successful response from the backend:
var secondSelect = $('#second-select');
secondSelect.empty();
// iterate over the instances in the response and add them to the second select
for (var instance in response.instances) {
secondSelect.append($('<option>', {
value : instance.id,
text : instance.text
}));
}
}
}
});
views.py
def render_template(request):
""" this method renders the template with context variables """
# set context variables:
context = {
"instances" : FirstModel.objects.all()
}
return render(request, 'template.html', context=context)
def get_instances(request):
""" this method returns json-friendly instances for the second select """
# unpack request:
instance_id = request.POST.get('instanceID')
# get instance:
instance = FirstModel.objects.get(id=instance_id)
# get instances
other_instances = SecondModel.objects.filter(first_model = instance)
# serialize data:
...
return JsonResponse({
"status_code" : 200,
"instances" : other_instances
})