如何在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 文件所做的。 )
您可以通过两种方式执行此操作:
您可以将 JavaScript 放入您的 Django 模板中(大概会生成 HTML 页面)。在那个 JavaScript 里面,你可以有更多的 Django 模板标签,这些标签在 HTML + JavaScript 被发送到浏览器之前被解释和替换。
如果你有一个纯 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 %}
我正在使用 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 文件所做的。 )
您可以通过两种方式执行此操作:
您可以将 JavaScript 放入您的 Django 模板中(大概会生成 HTML 页面)。在那个 JavaScript 里面,你可以有更多的 Django 模板标签,这些标签在 HTML + JavaScript 被发送到浏览器之前被解释和替换。
如果你有一个纯 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 %}