Значение переменной шаблона Django не может быть получено в Javascript / jQuery - PullRequest
2 голосов
/ 19 декабря 2011

Когда я сделал что-то вроде этого:

$("#show").click(function(){
   {% for p in collection %}            
      options.push({
            'href'  : '{{ p.id }}',
      });
   {% endfor %}
});

Я могу получить значение переменной шаблона Django.

Однако, когда я пытался сделать с другой стороны:

$('[name=test]').live('click', function() {
alert('{{ current_state }}');   
    var msg = '<div class="userName"> {{ current_user }} </div>';
    alert('Message' + msg);

});

Я не могу получить значение переменной шаблона Django из этого.

Что пошло не так отсюда? У меня была эта проблема, иногда получая переменную шаблона Django в javasript / jQuery.

EDIT

Когда я выполняю следующие строки поверх всего остального, весь JavaScript не работает. Есть идеи почему?

 $('body').data('current_user_id', {{ current_user_id }});
 $('body').data('current_user', {{ current_user }});

Ответы [ 3 ]

6 голосов
/ 19 декабря 2011

Обычно файл JS полностью статичен, и поэтому вы не можете вставлять в него переменные Django - он не работает таким образом.

Один из подходов, который вы можете использовать, - использовать Django.«запарковать» переменные, необходимые для JS, в вашем отрисованном HTML-шаблоне, а затем вы можете получить их и использовать их в коде JS, как требуется

, например, в шаблоне, который использует JavaScript в вашем примере, добавьте:

<script type="text/javascript">
  // attach variables from Django to the body node of the document
  $('body').data('current_state', {{current_state}});
  $('body').data('current_user', {{current_user}});
</script>

и затем в своем JS извлеките значение из карты данных:

$('[name=test]').live('click', function() {
    alert($('body').data('current_state'));   
    var msg = '<div class="userName">' + $('body').data('current_user') + '</div>';
    alert('Message' + msg);
});

Если вы не знаете о $ .data (), прочтите это

0 голосов
/ 16 июня 2013

Ваш подход работал и для меня, однако я обращался к переменным на той же странице, где загружалась моя библиотека jQuery. На мой взгляд:

from myapp.models import MyModel
from django.views.generic import TemplateView

class HomeView(TemplateView):
    template_name = 'base.html'
    def get_context_data(self, **kwargs):        
        rows = MyModel.objects.filter(title_slug='titleslug')
        context = super(HomeView, self).get_context_data(**kwargs)
        context['myvariables'] = []
        for row in rows
            context['myvariables'].append(row.somefieldval)
        return context

В моем шаблоне:

<script>
    options = []
   {% for var in myvariables %}
       imagesurls.push('{{var|safel}}');
   {% endfor %}
   alert(options);
</script>
0 голосов
/ 01 января 2012

Я понял, что пошло не так.Это было из-за загрузки Ajax.Таким образом, когда главная страница запрашивала загрузку страницы в тег с загрузкой Ajax, переменная шаблона Django отображалась только с подстраницы, но javascript был записан на главной странице.

Следовательно, для решенияэто, переменные шаблона должны быть переданы на главную страницу вместо подстраницы.

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