Немедленное обновление элементов страницы при изменении ввода с помощью django и AJAX внутри GET-запроса - PullRequest
0 голосов
/ 19 июня 2019

Я хочу обновить элементы на странице, чтобы в реальном времени сообщить пользователю, сколько объектов будет зависеть от выбора критериев в форме.

Для примера для работы форма запрашивает число, и логика django удалит любой экземпляр модели с pk меньшим, чем это значение, после нажатия кнопки отправки - но перед нажатием пользователь хочетчтобы знать, сколько их будет удалено:

<span id="number-changed">NULL</span> objects will be deleted

, поэтому я хочу получить конечный результат: #number-changed будет заполнено значением, подобным MyModel.objects.filter(pk__lt=input_number).count().

Я установил вызов AJAX для изменений input через:

 $("input").change( function() {
    $.ajax({
        type: "GET",
        url: "{% url 'myapp:bulkdelete' %}",
        data: {
            csrfmiddlewaretoken: $("input[name='csrfmiddlewaretoken']").val(),
        },
        success: function (data) {
        // code to update #number-changed
        }

Мне интересно, как я реализую в представлении, чтобы при успешном GET функция success могла использоватьзначение, которое я получаю.Некоторый псевдокод:

# views.py
class MyView(FormView):
    # ...
    def get(self, request, *args, **kwargs):
        input_number = ???  
        number_changed = MyModel.objects.filter(pk__lt=input_number).count()
        # presumably some super().get() call here
        return ???

Вопросы:

Могу ли я получить текущий input_number через request или его нужно передать как параметр url при созданииЗапрос AJAX?

Как добавить необходимую информацию, number_changed в данном случае, к возвращению метода get() и как получить к ней доступ * success?

То, как я реализовал AJAX с помощью django, до этого использовал запросы POST, и я просто возвращаю JsonResponse с моими необходимыми данными.Тем не менее, при загрузке страницы вызывается начальный get(), и он должен возвращать полный HttpResponse - так что, в конечном счете, есть способ добавить в него мою дополнительную информацию, или я ошибаюсь.

1 Ответ

1 голос
/ 19 июня 2019

Запрос Ajax точно такой же, как и любой другой запрос с точки зрения сервера.Вы можете просто включить данные в строку запроса, к которой вы затем получаете доступ в представлении через request.GET dict.

jQuery сгенерирует эту строку запроса для вас из параметра data;обратите внимание, вам не нужен токен csrf для запроса GET.Итак:

    type: "GET",
    url: "{% url 'myapp:bulkdelete' %}",
    data: {
        input_number: $(this).val(),
    },
    ...

А в поле зрения:

def get(self, request, *args, **kwargs):
    input_number = request.GET["input_number"]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...