无法从外部文件识别模板上下文(Django)

时间:2013-11-22 16:23:32

标签: django django-templates

所以,我一直在编辑一个网站并拥有许多JavaScript函数,这些函数利用了views.py文件传递给页面的上下文。到目前为止,这些函数已包含在base.html文件中,因此已直接加载到每个页面上。但是,为了使事情更清晰,我将所有函数复制并粘贴到外部.js文件中。现在,函数不是使用上下文,而是将它们视为文字字符串。

示例:

    $('#title').text('{{ event.name }}');

上面的行实际上会将元素的文本设置为“{{event.name}}”,而不是事件的名称。有想法该怎么解决这个吗?我真的不想将这些功能保存在基本文件中,任何检查页面源的人都可以看到它们。

2 个答案:

答案 0 :(得分:0)

如果您将javascript函数放在外部文件或base.html中,它仍会暴露给用户。只有缩小文件实际上有助于诱使用户看到实际值,但使用javascript,所有代码都是公开的。

为什么你遇到这个问题是因为你在内嵌javascript时(在你的base.html中)你有权访问模板上下文。 现在不再是这种情况了,Django模板引擎不再插入{{ event.name }}

你所面临的问题也很好。你永远不应该混淆和使用Djangos模板语言或任何模板语言来匹配javascript,修复它的唯一方法是

a) start pulling the values from the DOM ie. render a proper DOM 
b) to start to fetch the values from the server, traditionally using AJAX.

目前我能提出的最小例子如下:

您的观点:

def my_django_view(request):
   return HttpResponse(json.dumps({'meaningoflife':42}), mimetype='application/json')

您的HTML

<input type="hidden" id="myMeaning" value="{{ meaningoflife }}" />

你的javascript

var meaning = document.querySelector('#myMeaning').value;
alert(meaning); //should alert 42.

答案 1 :(得分:0)

在您的视图中,您将返回某种形式的 render_to_response ,其中包含模板参数和上下文参数。 render_to_response 函数的作用是读取您的模板,并将所有 {{placeholders}} 替换为通过上下文字典传递的值。

模板本质上是此

的复杂版本
"""
<h1>{{ person.name }}</h1> 
<p>{{ person.phone_number }}</p>
""".format(person)

问题是模板引擎不知道脚本指定的文件src属性实际上是Django模板。要解决此问题,请不要使用脚本src属性。而是做这样的事情。

<!--base.html-->
<h1>Site Title</h1>
<p>Some content</p>
<script>
{% include 'jsfile.js' %}
</script>

使用include语句应该可以解决问题。