如何在javascript中使用模板标签?姜戈

How to use template tags in javascript? Django

我正在使用 python(Django),我创建了一个模板标签,其中 returns 一个字典数组,现在我想在我的 javascript 中使用它。当我通过以 JSON 格式转储并在我的 javascript 中解析回来从视图中调用它时,它工作正常。但在模板标签中情况不同。到目前为止,我尝试了几种方法,但所有方法都有问题,如下所列。

第一种方式 最常见的是,在我的模板标签中,我将数组转储为 JSON 格式,并在 Javascript 和 JSON.parse

中调用它

以下代码 - 模板标签

@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)

Index.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 模板标签不会被解释,除非你强制 Django 提供 JavaScript 文件(而不是作为静态文件,这是人们通常对 JavaScript 文件所做的。 )

您可以通过两种方式执行此操作:

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

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

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


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

不要在 JavaScript 文件中粘贴 Django 模板标签,只需在主页(页眉或页脚)中设置一些适当的 JavaScript 变量,使用 Django 模板标签,然后简单地使用unchanged/un-marked-up JavaScript.

中的那些变量

例如:在页脚中,包括:

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