Запущенный Ajax запрос не обновляет Django View - PullRequest
0 голосов
/ 31 октября 2019

Я попытался разбить эту проблему на простейший пример. Когда запрос является ajax, рендеринг страницы с обновленным контекстом не дает ожидаемого результата.

index.html:

<html>
    <body>
        {% if templateVariable %}
            <h1>{{ templateVariable }}</h1>
        {% endif %}

        <button id="testBtn">TEST</button>

        <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js" type="text/javascript"></script> 
        <script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.16/jquery-ui.min.js" type="text/javascript"></script>
        <script type="text/javascript">

            $(document).ready(function() {
                $(function() {
                    $('#testBtn').click(function(event) {
                        $.ajax({
                            type: "POST",
                            url: "./",
                            data: {
                                'x' : 'x',
                                'csrfmiddlewaretoken' : '{{ csrf_token }}'
                            }
                        });
                    });
                });
            });

        </script>
    </body>
</html>

просмотров.py

def index(request):
    context = {}
    if 'x' in request.POST:
        context['templateVariable'] = 'I was updated via ajax'
        print('ajax ran')
        return render(request, 'index.html', context)
    context['templateVariable'] = 'I was not updated via ajax'
    print('ajax was not run')
    return render(request, 'index.html', context)
  • Когда я впервые загружаю страницу, печатается «ajax не был запущен», templateVariable - «Я не обновлялся через ajax», и страницарендерится с этим в теге h1 как ожидалось.

  • Когда я нажимаю testBtn, я ожидаю, что запрос ajax вызовет оператор if, обновит контекст и отобразит страницу с 'Iбыл обновлен с помощью ajax 'в теге h1.

  • Вместо этого печатается «ajax ran», но templateVariable остается «Я не обновлялся с помощью ajax» при визуализации страницы. «ajax не был запущен» печатается только один раз при начальной загрузке страницы.

Почему бы мне не получить ожидаемый результат?

РЕДАКТИРОВАТЬ: Кажется, все согласны с тем, что вы не можете вернуть переменные рендеринга и контекста с помощью запроса ajax, но у меня все еще есть проблемы с этим, так как я считаю, что это возможно. Вот некоторый альтернативный код:

index2.html:

<html>
    <body>
        {% if templateVariable %}
            <h1>{{ templateVariable }}</h1>
        {% endif %}

        <h1 id="placeHolder"></h1>

        <button id="testBtn">TEST</button>

        <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js" type="text/javascript"></script> 
        <script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.16/jquery-ui.min.js" type="text/javascript"></script>
        <script type="text/javascript">

            $(document).ready(function() {
                $(function() {
                    $('#testBtn').click(function(event) {
                        $.ajax({
                            type: "POST",
                            url: "./",
                            data: {
                                'x' : 'x',
                                'csrfmiddlewaretoken' : '{{ csrf_token }}'
                            },
                            success: function (data) {
                                $('#placeHolder').html(data);
                            },
                            dataType: 'html'
                        });
                    });
                });
            });

        </script>
    </body>
</html>

views2.py

def index2(request):
    context = {}
    if 'x' in request.POST:
        context['templateVariable'] = 'I was updated via ajax'
        print('ajax ran')
        return render_to_response('notIndex.html', context)
    context['templateVariable'] = 'I was not updated via ajax'
    print('ajax was not run')
    return render(request, 'index.html', context)

notIndex.html:

{% if templateVariable %}
    {{ templateVariable }}
{% endif %}
  • В этом примере страница изначально загружается с помощью templateVariable в контексте «Я не обновлялся с помощью ajax».
  • При нажатии testBtn запрос ajax вызывает блок if в представлении. Это отображает notIndex.html с обновленным контекстом.
  • Функция успеха вызова ajax устанавливает сгенерированный html из notIndex.html в тег h1.

Так почему это толькоМожно ли запустить рендеринг страницы с помощью ajax, если страница не та, с которой поступил вызов ajax?

1 Ответ

0 голосов
/ 31 октября 2019

Вы не можете возвращать отрисовки или перенаправления из AJAX, вот как это работает

Если вы хотите обновить свой пользовательский интерфейс на основе того, что происходит на сервере, скажите, что у вас есть корзина, и вы хотитереализуйте «добавить в корзину» без обновления страницы, кнопка «добавить в корзину» должна запросить конечную точку, указанную вами в urls.py, и этот URL должен возвращать true, если объект добавлен, или false, если это не так, но этоне будет обновлять его в пользовательском интерфейсе, вам нужно вручную изменить количество элементов корзины с помощью Javascript.

Если вы попытаетесь перенаправить или вернуть рендер в ajax, он получит HTML или перенаправление / рендер,больше ничего.

если вы хотите перенаправить, вы захотите сделать это с JS, но без переменных контекста из django.

см. ref

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...