javascript - 如何在javascript中使用模板标签?姜戈
问题描述
我正在使用python(Django),我创建了一个返回字典数组的模板标签,现在我想在我的javascript中使用它。当我通过以 JSON 格式转储并在我的 javascript 中解析回来从视图中调用它时,它工作正常。但是在模板标签中情况不同。到目前为止,我尝试了几种方法,但它们都有问题,它们在下面列出。
第一种方式 最常见的,在我的模板标签中,我将数组转储为 JSON 格式,并使用 JSON.parse 在 Javascript 中调用它
以下代码 - 模板标签
@register.simple_tag(takes_context = True)
def messageRequest(context):
request = context['request']
messageData = Message.objects.all()
jsMessageData = []
if 'user' in request.COOKIES:
currentUser = request.COOKIES.get('user')
i = 0
for i in range(len(messageData)):
if messageData[i].receiver == currentUser:
jsMessageData.append({"receiver":messageData[i].receiver, "sender":messageData[i].sender, "message":messageData[i].message})
if messageData[i].sender == currentUser:
jsMessageData.append({"receiver":messageData[i].receiver, "sender":messageData[i].sender, "message":messageData[i].message})
i += 1
return dumps(jsMessageData)
索引.html -testVal = JSON.parse("{%messageRequest%}");
结果:出现错误 Uncaught SyntaxError: Unexpected token & in JSON at position 2
第二种方法 我尝试在一个普通的 javascript 变量中调用 {%messageRequest%},我认为我将在 JSON 函数中使用该变量来防止语法错误,但这给了我同样的错误。所以我得出结论,我不能在我的 javascript 中使用模板标签,因为它的前缀(%),我也没有找到关于这个主题的任何内容。
第三种方式 这次我没有从模板发送 JSON 对象,而是将数组转换为字符串,并认为我会将其存储在 html 标记中,然后在 javascript 中调用它的值并将其解析为对象。
以下代码 - 模板标签
@register.simple_tag(takes_context = True)
def messageRequest(context):
request = context['request']
messageData = Message.objects.all()
jsMessageData = []
if 'user' in request.COOKIES:
currentUser = request.COOKIES.get('user')
i = 0
for i in range(len(messageData)):
if messageData[i].receiver == currentUser:
jsMessageData.append({"receiver":messageData[i].receiver, "sender":messageData[i].sender, "message":messageData[i].message})
if messageData[i].sender == currentUser:
jsMessageData.append({"receiver":messageData[i].receiver, "sender":messageData[i].sender, "message":messageData[i].message})
i += 1
return str(jsMessageData)
Index.html - {%messageRequest%}
Javascript - testValues = JSON.parse(document.getElementById('test').innerHTML);
结果- 这解决了我的问题,但我认为这是我能做的最低效的方法。
那么有没有办法直接在 Javascript 中使用模板标签呢?任何建议表示赞赏
解决方案
Django 模板标签在服务器端进行解释。
JavaScript 在浏览器端进行解释。
所以 Django 模板标签不会被解释,除非你强制 JavaScript 文件由 Django 提供(而不是作为一个静态文件,这通常是对 JavaScript 文件所做的)。
您可以通过两种方式做到这一点:
您可以将 JavaScript 放入您的 Django 模板(可能会生成 HTML 页面)。在该 JavaScript 中,您可以有更多的 Django 模板标签,这些标签在 HTML + JavaScript 发送到浏览器之前被解释和替换。
如果您有一个纯 JavaScript 文件,您想在其中粘贴 Django 模板标签,您可以执行以下操作:
与其将 JavaScript 文件的 URL 指向静态 JavaScript 文件,不如让它指向 Django 视图。该视图应该提供一个 Django 模板。该模板应包含带有 Django 模板标签标记的 JavaScript 代码。现在你在做生意。
但是,考虑这个更简单(可能更清洁)的解决方案:
无需在 JavaScript 文件中粘贴 Django 模板标签,只需使用 Django 模板标签在主页面(页眉或页脚)中设置一些适当的 JavaScript 变量,然后在未更改/未标记的 JavaScript 中简单地使用这些变量。
例如:在页脚中,包括:
{% if request.user %}
currentUser = "{{request.user}}"
{% else %}
currentUser = null;
{% endif %}
推荐阅读
- ios - moya 中的多部分表单数据,在 swift 中具有 int 值
- android - Android Things 中的锁屏
- javascript - 数组减少:如何处理来自前一个过滤器的空数组?
- linux - Linux:从用户空间实例化:eeprom new_device
- python - Django Field.Unique = False(给出完整性错误)
- r - 有没有办法将词云返回为字符串或字符数据类型?
- python - 使用python从word文档的第一页提取文本
- javafx - 在 javafx 中添加分页时,没有调用分页回调函数
- c# - 在 DataGridTextColumn 中编辑ElementStyle
- python - 如何使用可从 AWS Lex 调用的 AWS Lambda 打开弹出窗口?