Доступ к Django переменной из JavaScript переменной [решено] - PullRequest
0 голосов
/ 25 мая 2020

Прежде всего, я хотел бы сказать, что это мой первый вопрос здесь! (простите меня, если это избыточно или дублируется)

У меня проблемы с вызовом JS скриптов из Django шаблона:

image

Итак, во-первых, как можно Объявляю функцию снаружи. Я разработчик C, извините за мое незнание.

Я пытался создать сценарий снаружи, например

<script>
    function foo() {
      console.log('Hey');
    });
</script>

И вызвать его таким образом:

image

Но эта простая вещь, которая работает на чистом HTML, с django шаблонами, похоже, не работает ...

С другой стороны, реальный вопрос был в том, есть ли способ доступа к переменной Django, переданной при рендеринге с помощью переменной js?

Например:

const jsVariable = 'title';
document.getElementById('{{form.jsVariable.auto_id}}').value = '{{suggestion.jsVariable}}'

Я не нашел способа выполнить sh это, возможно есть еще одна отличная идея!

[РЕШЕНО]: Как сказал @SahilDesai, шаблон будет давать ответ только на переменные, которые отправляются через объект контекста из функции просмотра. Шаблон Jinja не знает о переменной, созданной javascript. Так что добиться этого кажется невозможным.

Ответы [ 3 ]

0 голосов
/ 25 мая 2020

Из вашего примера, похоже, вы хотите программно получить доступ к атрибуту модели Django в Javascript.

Главный вывод состоит в том, что вам сначала нужно предоставить доступ к структуре данных, к которой вы хотите получить доступ (т. Е. модель) в Javascript.

Вот простой, отредактированный, проверочный документ, который вы можете попробовать.

import json

def my_view(request):
    obj = MyModel.objects.get(1)
    obj_dict = {
        "foo": obj.foo,
        "bar": obj.bar,
    }
    return render(request, 'my_view.html', context={'obj_json': json.dumps(obj_dict)} )

<script>
var obj = {{obj_json}};

var field = 'foo';
console.log(obj[field]);

Проверить Преобразовать Django Объект модели для dict со всеми полями без изменений для исчерпания возможностей сериализации Django моделей в словари.

0 голосов
/ 28 мая 2020

Ну вот наконец-то я нашел решение обеих выявленных проблем.

  1. Прежде всего, функция скрипта, которую я объявил, не работала, потому что кажется, что есть атрибут с именем autocomplete (см. autocomplete HTML attribute ) Итак, вы не можете объявить функцию JavaScript с таким именем, моя ошибка. Uncaught TypeError: autocomplete is not a function

  2. Наконец, простое решение, которое я нашел, заключалось в передаче в шаблон массива dicts:

return render(request, 'example.html', {'form': form, 'suggestions': suggestions })

И затем в шаблоне:

image

Что, сравнивая с вопросом, действительно упрощает задачу.

0 голосов
/ 25 мая 2020

Я пробовал один пример. где отправить переменную из сценария python и получить доступ к ее значению в JavaScript

1) В views.py

from django.shortcuts import render

def home_view(request):
    var_name = 'hello'
    return render(request, 'home.html', {'var_name':var_name})

2) В файле html (home. html)

<html>
    <h1>Home Page</h1>
    <input type="button" value="Submit" onclick="fun()">

    <script>
        function fun(){
            console.log('hello world '+ '{{var_name}}' );
        }
        var temp = '{{var_name}}';
        console.log(temp + 20);
    </script>
</html>

Если я нажму кнопку отправки (hello world hello), в консоли будет напечатано

Я сохранил значение var_name в temp, которое можно использовать в дальнейшем.

...