Обработка данных Ajax при передаче в Django CBV

#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. Можете ли вы создать демонстрационный код для демонстрации такого поведения? Было бы легко понять, в чем может быть проблема.