Передать динамическую переменную Javascript в Django/Python

Я просмотрел ряд ответов и других веб-сайтов, но никто не ответил на мой конкретный вопрос. У меня есть веб-страница с кнопками "+" и" -", которые должны увеличивать переменную под названием "pieFact". Эта переменная должна обновляться динамически без необходимости обновления страницы. Затем он должен передаваться в мое представление Django при каждом изменении значения. Это будет использоваться для обновления размера круговых диаграмм на веб-карте. У меня есть следующее:

<button type="button" id=bttnMinus onclick="pieFact=pieFact*0.9">-</button>
<button type="button" id=bttnPlus onclick="pieFact=pieFact*1.1">+</button></td> 
<script type="text.javascript">
    var pieFact=0;
</script>

Как я могу передать значение "пирофакт" Джанго? Основываясь на моих ограниченных знаниях, я думаю, что мне, возможно, придется использовать AJAX post/get.

1 ответов


чтобы не обновлять страницу, да, вам понадобится AJAX. Я обычно не люблю предлагать библиотеки слишком много в ответах, однако, в интересах легкой кросс-браузерной совместимости, я бы предложил использовать jQuery.

С jQuery это было бы так же просто, как

внутри вашего шаблона django

<html>
    ...
    <head>
        <script>
            var URL = "{% url 'my_view_that_updates_pieFact' %}";
        </script>
    </head>
...

позже...

вам нужно либо опубликовать, либо получить данные на сервер через AJAX. К будьте более спокойны, когда мне нужно отправить данные на сервер, я использую POST. библиотека jQuery предоставляет $.post () функция удобства для данных AJAX по url-адресу через POST. Тремя параметрами являются URL-адрес, данные для отправки (как объект JavaScript; подумайте о словарях python, если вы не слишком знакомы с JavaScript) и функция обратного вызова, как только сервер отправляет ответ.

<script>
function updatePieFact(){
    var data = {'pieFact': pieFact};
    $.post(URL, data, function(response){
        if(response === 'success'){ alert('Yay!'); }
        else{ alert('Error! :('); }
    });
}

на .click() функции в основном то же самое, что и указание onlick в html атрибут. Оба нажмите события update pieFact как и следовало ожидать, а затем позвоните updatePieFact() отправить значение pieFact на сервер.

$(document).ready(function(){
    $('#bttnMinus').click(function(){
        pieFact *= 0.9;
        updatePieFact();
    });
    $('#bttnPlus').click(function(){
        pieFact *= 1.1;
        updatePieFact();
    });
});
</script>

In views.py

так как я использовал $.post() функция в JavaScript, запрос, который Django собирается получить, будет иметь метод "POST", поэтому я проверяю, чтобы убедиться, что метод действительно POST (это означает, что если кто-то посещает URL для этого представления с чем-то вроде запроса GET, они не будут все обновления). Как только я вижу, что запрос на самом деле POST, Я проверяю, чтобы увидеть, если ключ 'pieFact' в дикт request.POST.

помните, когда я установил переменную data в javascript для {'pieFact': pieFact}? Этот javascript просто становится запросом.Опубликовать словарь python. Итак, если в javascript я вместо этого использовал var data = {'hello': pieFact};, тогда я буду проверять if 'hello' in request.POST вместо. Как только я это увижу!--6--> в запросе.POST dictionary, я могу получить его значение, а затем что-то сделать с ним. Если все успешно, я возвращаю HttpResponse в строке 'success'. Это коррелирует с проверкой в javascript:if(response === 'success').

def my_view_that_updates_pieFact(request):
    if request.method == 'POST':
        if 'pieFact' in request.POST:
            pieFact = request.POST['pieFact']
            # doSomething with pieFact here...
            return HttpResponse('success') # if everything is OK
    # nothing went well
    return HttpRepsonse('FAIL!!!!!')

надеюсь, это поможет вам в правильном направлении.