Я работаю над проектом с Django для системы управления рестораном. Я хотел использовать функцию автозаполнения, чтобы принимать заказы за столом.
Насколько я понимаю, функция JQueryUI autocomplete() - это то, что мне нужно.
Однако я не могу заставить его работать.
Ниже приведен мой HTML-код для страницы. Он работает таким образом, что после того, как количество людей в группе вставлено, такое же количество полей ввода формы вставляется в таблицу с помощью сценария Javascrip.
addOrder.html
{% load static %}
<!DOCTYPE html>
<html lang = "en">
<head>
<meta charset = "UTF-8">
<link rel = "stylesheet" href = "//maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css">
<link rel = "stylesheet" href = "//maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap-theme.min.css">
<script type = "text/javascript" src = {% static "js/jquery-3.3.1.min.js" %}></script>
<script src = {% static "js/jquery-ui.min.js" %}></script>
<link rel = "stylesheet" href = "https://ajax.googleapis.com/ajax/libs/jqueryui/1.11.4/themes/smoothness/jquery-ui.css">
<script type = "text/javascript" src = {% static "js/createOrderIn.js" %}> </script>
<script type = "text/javascript" src = {% static "js/autocompleteDrink.js" %}></script>
<script type = "text/javascript" src = {% static "js/autocompleteMenu.js" %}></script>
<style>
.move {
margin: 30px;
}
</style>
<title>Add Order</title>
</head>
<body>
<div class = "move">
<form action = "/orders/addOrder" method = "post" id = "the-form" class = "ui-widget">
<label> Party of </label>
<input type = "text" id = "people">
<input type = "submit" class = "btn btn-primary" value = "Submit order">
</form>
</div>
</body>
</html>
Это сценарий, который я использую для создания новых полей ввода формы.
createOrderIn.js
$(document).ready(function () {
var previous = 0;
var considered = 0;
$("#people").keyup(function ( ) {
var actual = this.value;
if (actual==null){
actual=1;
}
var toAdd = actual-previous;
previous = actual;
if (toAdd > 0){
for(var i=0; i<toAdd; i++){
considered+=1;
var htmlToAdd = $("<div class = "+considered+"><input type=\"text\" name=\"menu_"+considered+"\" id=\"menu\"><input type=\"text\" name=\"drink_"+considered+"\" value=\"No drink\" id=\"drink\"><br></div>");
$("#the-form").append(htmlToAdd);
}
}
else{
for(var j=0; j<(-1*toAdd); j++) {
if (considered > 0) {
$("."+considered).remove();
considered -= 1;
}
}
}
});
});
Ниже приведены относительные файлы Python / Django.
urls.py
from django.urls import path
from . import views
urlpatterns = [
path('', views.ordersIndex, name = "index"),
path('changeStatus/<int:pk>', views.changeStatus, name = "changeStatus"),
path('addOrder', views.addOrder, name = "addOrder"),
path('addOrderRender', views.addOrderRender, name = "addOrderRender"),
path('getDrinks', views.getDrinks, name = "getDrinks"),
path('getMenus', views.getMenus, name = "getMenu"),
]
views.py (только функция getMenus())
def getMenus(request):
print("I am called")
if request.is_ajax():
q = request.GET.get('term', '')
menus = Menu.objects.filter(name__contains=q)
results=[]
for menu in menus:
menu_json = {}
menu_json['name'] = menu.name
menu_json['n_courses'] = menu.number_of_courses
menu_json['price'] = menu.price
results.append(menu_json)
data = json.dump(results)
else:
data = 'fail'
mimetype = 'application/json'
return HttpResponse(data, mimetype)
И, наконец, это функция, которая должна использовать JQueryUI для выполнения вызова ajax и получения возможных меню
autocompleteMenu.js
$(function() {
$("#menu").autocomplete({
source: "/orders/getMenus/",
});
});
Как вы, вероятно, можете видеть из функции getMenus() в views.py, я также печатаю контрольную строку («Меня зовут»), которая, конечно же, не выводится на консоль. Также нет результата даже при переключении параметра autocomplete()source на локальный массив.
Мне кажется, что я делаю очень наивную ошибку, но я действительно не могу ее понять (я также довольно новичок в JQuery).
Я думаю, что ошибка должна быть в предоставленных файлах, но я буду рад опубликовать правки на всякий случай
Заранее спасибо!





Я понял, что проблема связана с тем, что мне пришлось привязать автозаполнение к идентификатору вновь созданного идентификатора (который я изменил на классы). Также данные JSON должны иметь поле lable (и мне пришлось использовать json.dumps(), а не json.dump(): p).
Следующие действия сделали свое дело:
createOrderIn.js
$(document).ready(function () {
var previous = 0;
var considered = 0;
$("#people").keyup(function ( ) {
var actual = this.value;
if (actual==null){
actual=1;
}
var toAdd = actual-previous;
previous = actual;
if (toAdd > 0){
for(var i=0; i<toAdd; i++){
considered+=1;
var htmlToAdd = $("<div class = "+considered+"><input type=\"text\" name=\"menu_"+considered+"\" class=\"menu\"><input type=\"text\" name=\"drink_"+considered+"\" value=\"No drink\" class=\"drink\"><br></div>");
$("#the-form").append(htmlToAdd);
$('#the-form').find('input[class=menu]:last').autocomplete({
source: "/orders/getMenus"
});
$('#the-form').find('input[class=drink]:last').autocomplete({
source: "/orders/getDrinks"
});
}
}
else{
for(var j=0; j<(-1*toAdd); j++) {
if (considered > 0) {
$("."+considered).remove();
considered -= 1;
}
}
}
});
});
views.py
def getDrinks(request):
if request.is_ajax():
q = request.GET.get('term', '')
drinks = Drink.objects.filter(name__contains=q)
results=[]
for drink in drinks:
drink_json = {}
drink_json['label'] = drink.name
results.append(drink_json)
data = json.dumps(results)
else:
data = 'fail'
mimetype = 'application/json'
return HttpResponse(data, mimetype)
def getMenus(request):
if request.is_ajax():
q = request.GET.get('term', '')
menus = Menu.objects.filter(name__contains=q)
results=[]
for menu in menus:
menu_json = {}
menu_json['label'] = menu.name
menu_json['id'] = menu.number_of_courses
results.append(menu_json)
data = json.dumps(results)
else:
data = 'fail'
mimetype = 'application/json'
return HttpResponse(data, mimetype)