当前位置:  开发笔记 > 编程语言 > 正文

Django模板变量和Javascript

如何解决《Django模板变量和Javascript》经验,为你挑选了6个好方法。

当我使用Django模板渲染器渲染页面时,我可以传入包含各种值的字典变量,以便在页面中使用它们进行操作{{ myVar }}.

有没有办法在Javascript中访问相同的变量(也许使用DOM,我不知道Django如何使变量可访问)?我希望能够使用基于传入的变量中包含的值的AJAX查找来查找详细信息.



1> S.Lott..:

{{variable}}直接代入HTML.做一个观察源; 它不是"变量"或类似的东西.它只是渲染文本.

话虽如此,您可以将这种替换放入JavaScript中.


这为您提供了"动态"javascript.


请注意,根据[此解决方案](http://stackoverflow.com/questions/298772/django-template-variables-and-javascript/1187881#1187881),这很容易受到注入攻击
只是添加到此参考:如果"someDjangoVariable"碰巧是JSON,请务必使用{{someDjangoVariable | safe}}来删除"
@Casebash:对于这种情况,`escapejs`过滤器存在:`escapejs('<>') - > u'\\ u003C \\ u003E'`
如果javascript是用不同的文件写的呢?
这个答案只适用于一个简单的变量,它不适用于复杂的数据结构.在这种情况下,最简单的解决方案是添加客户端代码以遍历数据结构并在Javascript中构建类似的数据结构.如果复杂数据结构是JSON格式,另一种解决方案是序列化它,将序列化的JSON传递给服务器端代码中的Django模板,并在客户端代码中的javascript对象中反序列化JSON.下面的一个答案提到了这个选择.
10年后,Django为此专门引入了内置模板过滤器:https://docs.djangoproject.com/en/2.1/ref/templates/builtins/#json-script
请更新此选项以包含| escapejs过滤器,否则您最终可能会在名称等中包含引号字符的变量,这可能会导致XSS攻击.
所以最好的解决方案是使用`var a = {{someDjangoVariable | escapejs | safe}}"`然后呢?

2> Yaroslav Adm..:

小心检查故障单#17419,了解有关在Django核心中添加类似标记的讨论,以及使用此模板标记和用户生成的数据引入的可能的XSS漏洞.来自amacneil的评论讨论了票证中提出的大部分问题.


我认为最灵活,最方便的方法是为要在JS代码中使用的变量定义模板过滤器.这样可以确保您的数据被正确转义,并且可以将其用于复杂的数据结构,例如dictlist.这就是为什么我写这个答案,尽管有很多赞成的答案已被接受.

以下是模板过滤器的示例:

// myapp/templatetags/js.py

from django.utils.safestring import mark_safe
from django.template import Library

import json


register = Library()


@register.filter(is_safe=True)
def js(obj):
    return mark_safe(json.dumps(obj))

此模板过滤器将变量转换为JSON字符串.您可以像这样使用它:

// myapp/templates/example.html

{% load js %}



这很好,因为它只允许将一些Django模板输入变量复制到Javascript,服务器端代码不需要知道Javascript必须使用哪些数据结构,因此在呈现Django模板之前转换为JSON.要么使用它,要么总是将所有Django变量复制到Javascript.
然后如何在Django模板中显示变量?

3> bosco-..:

对我有用的解决方案是使用模板中的隐藏输入字段


然后以这种方式获取javascript中的值,

var myVar = document.getElementById("myVar").value;


但要警惕.根据您使用变量/表单的方式,用户可以放入他们想要的任何内容.
您可能还希望将输入字段设置为只读(请参阅此链接http://www.w3schools.com/tags/att_input_readonly.asp)
伙计们......用户可以做他们想做的事情.浏览器现在使用功能齐全的DOM检查器和调试工具变得如此简单.故事的道德:在**服务器上进行所有数据验证**.

4> Jon Sakas..:

从Django 2.1开始,专门针对此用例引入了一个新的内置模板标记:json_script

https://docs.djangoproject.com/zh-CN/2.1/ref/templates/builtins/#json-script。

新标签将安全地序列化模板值并防止XSS。



5> jamtoday..:

对于字典,您最好先编码为JSON.您可以使用simplejson.dumps(),或者如果要从App Engine中的数据模型进行转换,可以使用GQLEncoder库中的encode().


这个方法在我关闭django autoescape之后起作用了.

6> Insomniak..:

这是我正在做的很容易:我修改了我的模板的base.html文件并将其放在底部:

{% if DJdata %}
    
{% endif %}

然后,当我想在javascript文件中使用变量时,我创建了一个DJdata字典,并通过json将其添加到上下文中: context['DJdata'] = json.dumps(DJdata)

希望能帮助到你!

推荐阅读
ERIK又
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有