首页 > 解决方案 > 如何在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 中使用模板标签呢?任何建议表示赞赏

标签: javascriptjsondjangotemplatetags

解决方案


Django 模板标签在服务器端进行解释。

JavaScript 在浏览器端进行解释。

所以 Django 模板标签不会被解释,除非你强制 JavaScript 文件由 Django 提供(而不是作为一个静态文件,这通常是对 JavaScript 文件所做的)。

您可以通过两种方式做到这一点:

  1. 您可以将 JavaScript 放入您的 Django 模板(可能会生成 HTML 页面)。在该 JavaScript 中,您可以有更多的 Django 模板标签,这些标签在 HTML + JavaScript 发送到浏览器之前被解释和替换。

  2. 如果您有一个纯 JavaScript 文件,您想在其中粘贴 Django 模板标签,您可以执行以下操作:

与其将 JavaScript 文件的 URL 指向静态 JavaScript 文件,不如让它指向 Django 视图。该视图应该提供一个 Django 模板。该模板应包含带有 Django 模板标签标记的 JavaScript 代码。现在你在做生意。


但是,考虑这个更简单(可能更清洁)的解决方案:

无需在 JavaScript 文件中粘贴 Django 模板标签,只需使用 Django 模板标签在主页面(页眉或页脚)中设置一些适当的 JavaScript 变量,然后在未更改/未标记的 JavaScript 中简单地使用这些变量。

例如:在页脚中,包括:

{% if request.user %} 
  currentUser = "{{request.user}}" 
{% else %} 
  currentUser = null; 
{% endif %} 

推荐阅读