#javascript #django #ajax #jquery-select2 #django-autocomplete-light
#javascript #django #ajax #jquery-select2 #django-автозаполнение- свет
Вопрос:
Я использую django-autocomplete-light с виджетом select2 «выбрать несколько» для формы M2M. Я настроил его так, чтобы включить «Создать новый», когда ввод не найден. Однако в моей модели есть дополнительные обязательные поля, помимо первоначального ввода виджета «выбрать несколько». Я пытаюсь создать способ запрашивать у пользователя дополнительные поля при попытке создания, а затем отправлять эти данные через ajax в мое представление django. Прямо сейчас, если я предварительно предоставлю другие обязательные поля в моем представлении, пользователь может создать новый объект с именем, которое он ввел (и нажал «Создать новый»), а другие поля будут определены в моем представлении. Это показывает мне, что код работает, но в идеале я хотел бы запросить у пользователя дополнительные данные. Я создал приглашение, однако я не могу использовать правильный синтаксис для передачи данных.
В качестве примера представьте, что у меня есть модель с обязательными полями «Имя» и «Местоположение». В виджете Select2 пользователь вводит «Имя», которое не существует как объект, и нажимает «Создать новый». Теперь я бы хотел, чтобы скрипт запрашивал у них местоположение, а затем передавал его в качестве параметра get_or_create .
Код ниже:
**views.py**
class Videoautocomplete(autocomplete.Select2QuerySetView):
create_field = 'name'
def create_object(self, text):
"""Create an object given a text."""
object = Model.objects.all()[0]
return self.get_queryset().get_or_create(name=text, location=object.location)[0]
def get_queryset(self):
"""This is the code for the initial search within the select2 field"""
qs = Model.objects.order_by('name')
if self.q:
qs = qs.filter(name__icontains=self.q)
return qs
**select2.js**
$(this).on('select2:selecting', function (e) {
var data = e.params.args.data;
if (data.create_id !== true)
return;
e.preventDefault();
var select = $(this);
$.ajax({
url: $(this).attr('data-autocomplete-light-url'),
type: 'POST',
dataType: 'json',
beforeSend: function(xhr, settings) {
xhr.setRequestHeader("X-CSRFToken", document.csrftoken);
"""Below is prompting the user for the location, and assigning it to the variable location"""
var location = prompt("Please enter the location", "");
},
"""How do I add the contents of the variable Location into the data below?"""
data: {
text: data.id,
forward: yl.getForwards($(this))
},
success: function(data, textStatus, jqXHR ) {
select.append(
$('<option>', {value: data.id, text: data.text, selected: true})
);
select.trigger('change');
select.select2('close');
}
});
});
Если я перехватываю переданный объект JSON в виде строки (используя «test» в качестве входных данных), я получаю следующее:
{"id":"test","text":"Create "test"","create_id":true}
Мне нужно выяснить, как ввести переменную Location в этот объект, но я не могу разобраться в синтаксисе. Любая помощь?
Комментарии:
1. Привет,
location
будет иметь значение, которое вводится пользователем, которое вы можете просто использоватьlocation :location
,data
чтобы отправить его на свой серверный сервер, или, если это не сработает, поместите этот код запроса перед этимajax
вызовом.2. Это не работает. Я перестроил его, чтобы запрашивать местоположение при начальной загрузке страницы, затем включил «местоположение: местоположение» под данными, и результат точно такой же. Я уверен, почему, но вывод объекта JSON — это id, text и create_id, но ни одна из этих вещей на самом деле не определена в разделе данных. Вот почему я так запутался. Я понятия не имею, где объект получает эти параметры.
3. Можете ли вы создать демонстрационный код для демонстрации такого поведения? Было бы легко понять, в чем может быть проблема.