2011-12-30 8 views
17

To pytanie musi być oczywiste, ale nie mogę tego rozgryźć.Jak mogę przekazać moje zmienne kontekstowe do pliku javascript w Django?

W szablonie łączę się z plikiem js w moim katalogu multimediów. Z tego pliku chciałbym uzyskać dostęp do zmiennej kontekstowej, takiej jak {{my_chart}}.

Ale czy składnia jest inna ?? Dziękuję Ci!!

+0

Możliwy duplikat [Django Zmienne szablonu i Javascript ] (http://stackoverflow.com/questions/298772/django-template-variables-and-javascript) – Cory

Odpowiedz

16

Nie sądzę, że jest to możliwe w ten sposób. Jeśli chcesz uzyskać dostęp do niektórych danych dostarczonych przez widok, musisz przekazać go do funkcji js.

Przykład

js file:

my_cool_js_function(some_param){ 
    // do some cool stuff 
} 

widok

// some html code 

my_cool_js_function({{param}}) 

nadzieję, że to pomoże :)

+0

Pamiętaj, aby rzucić okiem na [{{value | escapejs}}] (https://docs.djangoproject.com/pl/dev/ref/templates/builtins/# escapejs) – danihp

15

Oprócz odpowiedzi Andrzej Bobak, można również wygenerować zmienną globalną w JavaScript ze swojego szablonu. Na przykład, szablon może wygenerować kod tak:

<script> 
    var my_chart = {{ the_chart }}; 
</script> 

Twój skrypt może następnie odwołać się do my_chart.

+0

@ Brian_Neal jak to działa? Czy możesz po prostu zrobić coś w stylu 'console.log (my_chart);' w pliku javascript i nie musisz go nigdzie deklarować? – YPCrumble

+0

@YPCrumble To jest zadeklarowane w html generowanym przez Django. Jeśli ten sam plik html zawiera również zewnętrzny plik javascript, to javascript może odnosić się do tej zmiennej. –

+1

To jest znakomita odpowiedź, o ile zadeklarujesz zmienną globalną przed zaimportowaniem pliku js, powinieneś być w porządku. Dzięki. –

3

Chciałbym również dodać, bo wpadł błędu kilka razy, że jeśli zmienna python jest obiektem będzie rzucać błąd składni, chyba że można umieścić go w cudzysłowach, innymi słowy, w szablonie,

<script> 
    var my_var = '{{ python_object|escapejs }}'; 
</script> 

Co więcej, przed umieszczeniem tego obiektu w kontekście najlepiej jest najpierw serializować go do JSON, lub będziesz musiał przerobić ciąg znaków. Zauważyłem również, że obiekty daty muszą zostać przekonwertowane na łańcuchy przed tym krokiem.

import jsonpickle 

context['python_object'] = jsonpickle.encode(python_object) 

I wreszcie, w JS można następnie iterację obiektu prawidłowo i używać wartości jak pewnie musiałaby w Pythonie, wykonując:

var my_var_parsed = jQuery.parseJSON(my_var); 
Powiązane problemy