web2py: как скопировать массив python в один из JavaScript - PullRequest
3 голосов
/ 23 сентября 2011

У меня сейчас проблема с получением javascript и python для связи в web2py.

controller:

def testDB():
        a=[]
        a.append('a')
        a.append('b')
        a.append('c')
        return dict(m=a)

(со временем это будет заменено массивом строк БД)В настоящее время я пытаюсь присвоить значения в м массиве в JavaScript.Я пробовал это несколькими способами:

var t="{{=m}}";

Возвращает около 43 бессмысленных символов.Затем я попытался:

var t= new Array(); var i=0;"{{q=0}}"
"{{i=len(message)}}"
i="{{=i}}";
for(q=0;q<i;q++,"{{q=q+1}}"){
t[q]="{{m[q]}}";
}

Что не удалось, поскольку переменная python q сбрасывалась каждый раз, когда выполнялся цикл, что является сердцем моей проблемы.Я также попытался использовать pop:

for(q=0;q<i;q++,"{{q=q+1}}"){
    alert("{{m.pop()}}");
    }

Но массив продолжает сбрасываться снова в начале цикла, поэтому он продолжает показывать ту же самую переменную.Есть ли более простой способ скопировать массивы, или остановить сброс переменных python, или даже просто подключить переменную javascript q к «{{m [q]}}» вместо этого?

Из того, что я 'мы обнаружили, что проблема заключается в том, что python является серверной стороной, поэтому вы не можете присвоить значения javascript его переменным, но я не уверен, что это имеет отношение к части цикла (если я делаю то же самое вне цикла,значения не сбрасываются).Общее решение, похоже, заключается в использовании ajax или json, но я бы хотел избежать этого, если это возможно.Спасибо

Ответы [ 3 ]

6 голосов
/ 23 сентября 2011

В web2py (или на любом языке шаблонов на стороне сервера) вы не можете смешивать код Python на стороне сервера с кодом Javascript на стороне клиента, как вы это делаете. Когда страница запрашивается, оценивается Python в представлении web2py, и генерируется чистая HTML-страница (с включенным кодом Javascript), которая возвращается в браузер. Браузер не получает код Python и не может выполнить смесь Javascript и Python.

Представление web2py вставляет текст / код на страницу только при наличии {{=some_value}} (обратите внимание на знак равенства). Таким образом, такие вещи, как {{m[q]}} не имеют никакого эффекта. Если вы хотите увидеть, что браузер получает от web2py, посмотрите на источник страницы в браузере - он покажет вам конечный результат HTML / Javascript, сгенерированного вашим представлением.

Что касается вашего конкретного вопроса, вы можете использовать response.json() для преобразования списка Python в объект JSON. Однако, если вы включите это как в представлении, оно будет экранировать все кавычки, поэтому вы должны передать его в XML() помощник , чтобы избежать экранирования. Примерно так:

var t = {{=XML(response.json(m))}}
2 голосов
/ 23 сентября 2011

Используйте модуль json:

>>> import json
>>> s = json.dumps(range(5))
>>> print repr(s)
'[0, 1, 2, 3, 4]'
>>> print json.loads(s)
[0, 1, 2, 3, 4]
>>>
1 голос
/ 02 декабря 2016

Ответ Энтони не работает на web2py 2.9.12 или выше.

Чтобы присвоить значение переменной python переменной javascript, сначала преобразуйте его в json в контроллере, а затем передайте в представлениеИ в представлении, используйте XML(), чтобы назначить его переменной Java, чтобы он не экранировался

Контроллер

from gluon.serializers import json

def index():
    array = [1, 2, 3, 4, 5]
    dictionary = dict(id=1, name='foo')
    return dict(array=json(array), dictionary=json(dictionary))

Представление

<script>
    var js_array = {{=XML(array)}};
    var js_dictionary = {{=XML(dictionary)}};
</script>

Другое решение - использование ASSIGNJS помощник

Контроллер

def index():
    array = [1, 2, 3, 4, 5]
    dictionary = dict(id=1, name='foo')
    return dict(array=array, dictionary=dictionary)

Просмотр

<script>
    {{=ASSIGNJS(js_array = array)}}
    {{=ASSIGNJS(js_dictionary = dictionary)}}
</script>
...