Как добавить новую опцию для тега select в select2 - удаленные данные
Я реализовал приложение, в одной из форм есть много данных в выпадающем поле, требуется некоторое время для загрузки этой страницы, поэтому я хочу загрузить ее в ajax вызове, но при возврате данных не создается новый тег option и не добавляется к тегу select, вот что я пытался
я пробовал все эти коды, но ни один из них не сработал!
$(document).ready(function () {
$('#guestinfo').select2({
ajax: {
url: '{% url "booking:return_ajax_guests" %}',
dataType: 'json',
processResults: function (data) {
console.log(data.length)
if(data.length > 0){
for(i=0;i <= data.length;i++){
//var options = data[i].full_name
//console.log(options)
//$('#guestinfo').append("<option value='"+options+"'>"+options+"</option>")
//$('#guestinfo').trigger('change');
//var opts = new Option("option text", "value");
//$(o).html("option text");
//$("#guestinfo").append(o);
$('#guestinfo').append($('<option>', {
value: options,
text : options
}));
}
}
//return {
// results: $.map(data, function (item) {
// $('#guestinfo').append("<option value='"+item.full_name+"' selected>"+item.full_name+"</option>")
// $('#guestinfo').trigger('change');
// return {full_name: item.full_name, city: item.city__name};
// })
//console.log(results)
//};
}
},
minimumInputLength: 0
});
})
<div class="col-span-5 groupinput relative bglightpurple mt-2 rounded-xl">
<label class="text-white absolute top-1 mt-1 mr-2 text-xs">{% trans "full names" %}</label>
<select name="guestinfo" id="guestinfo" class="visitors w-full pr-2 pt-6 pb-1 bg-transparent focus:outline-none text-white">
<option value="------">---------</option>
</select>
</div>
версия select2 : 2.0.7 и вот мой код на стороне сервера (django)
@login_required
def return_ajax_guests(request):
if request.is_ajax():
term = request.GET.get('term')
all_guests = Vistor.objects.all().filter(full_name__icontains=term)
return JsonResponse(list(all_guests.values('full_name','city__name','dob')),safe=False)
данные отображаются в консоли очень хорошо! но я не могу добавить их в тег select! может я что-то не так сделал? заранее спасибо ..
Ваша идея использовать Ajax - хорошая идея. Проблема, как мне кажется, вот здесь
url: '{% url "booking:return_ajax_guests" %}',
{% %}
используется, когда вы рендерите страницу в Django с помощью функции render, которая принимает url внутри { % %}
и заменяет его на переменные в вашем представлении, вашем коде python django.
JavaScript загружается ПОСЛЕ того, как Django отрендерит страницу, так что это фактически создаст СТРОКУ '{% url "booking:return_ajax_guests" %}'
, что, конечно, не то, что вы хотите.
JQuery - не моя сильная сторона, но вы должны быть в состоянии передать url в вашем Ajax вызове следующим образом (я использовал это, используя Vanilla JavaScript fetch, и это работало отлично):
url: 'booking:return_ajax_guests',
Во-первых, нет необходимости вручную создавать опции, select2 автоматически создает их при предоставлении правильных данных.
С учетом сказанного, ваши данные должны быть представлены в форме [{id: 'id', text: 'text'}, ...]
, чтобы они правильно работали с select2.
Попробуйте это
$('#guestinfo').select2({
ajax: {
url: '{% url "booking:return_ajax_guests" %}',
dataType: 'json',
data: function(params){ // you can delete this part if you don't intend to filter the data on the server
return {
search: params.term, // search term
};
},
processResults: function (data, params) {
return {
results: data.map(({full_name}) => ({id: full_name, text: full_name}))
};
}
},
minimumInputLength: 0
});