我想构建一个菜单,我可以使用{%block%}标记设置一个突出显示的链接。我的Javascript中有类似的东西:
<loop>
$('#a-div').append('{% block ' + variable + ' %} <a href...</a> {% endblock %}')
<endloop>
在来源中,显示为“{%block Home%}”
如何让JQuery不将其作为字符串附加,而是作为模板标记?
答案 0 :(得分:4)
你做不到。至少没有向Django模板发出AJAX请求。在您的情况下,它会很慢,并提出不必要的额外请求。这不值得。您可以使用例如jQuery load
函数通过jQuery从Django模板插入片段。但是您无法替换特定的{% block %}
标记,因为在jQuery运行时,模板已经被处理(并且对块标记的引用已被删除)。但这不是你在任何情况下应该这样做的情况。
为什么不用CSS类突出显示菜单?以下是我解决此问题的常用方法:
base_extras.py
个文件夹中创建名为templatetags
的文件。如果您没有,请在适当的文件夹中创建一个。在base_extras.py
内,粘贴此代码:
from django import template
from django.core.urlresolvers import reverse
register = template.Library()
@register.simple_tag
def navactive(request, urls):
if request.path in ( reverse(url) for url in urls.split() ):
return "active"
return ""
现在,在您的模板中,在基本模板的菜单上,执行以下操作:
<ul class="menu">
<li class="home {% navactive request 'home' %}"><a href="{% url home %}">Home</a></li>
<li class="contact {% navactive request 'contact' %}"><a href="{% url contact %}">Contact</a></li>
<li class="signup {% navactive request 'signup' %}"><a href="{% url signup %}">Sign up</a></li>
</ul>
这将使您当前URL所在的菜单具有active
类。然后,在CSS中,只需为active
的菜单项添加一个特殊类,看起来与其他菜单略有不同。
ul.menu li.active {background: red; color: white;}
如果你碰巧需要用jQuery更改活动菜单,你可以删除所有菜单上的active
类,并将其添加到新选择的菜单中:
$('ul.menu li').removeClass('active').find('.home').addClass('active'); // for example
答案 1 :(得分:1)
你不能那样做。在将页面发送到浏览器之前,在服务器端处理Django模板标签。另一方面,在从服务器收到页面后,在浏览器中调用Javascript(包括jQuery)。
您可以做的是将{% block %}
标记的内容预呈现给JS变量并在jQuery代码中使用它:
var blockContent = "{% block Home %} ... {% endblock %}";
// ...
$("#a-div").append(blockContent);
如果您需要多个块可供选择(正如您在提供的代码示例中所示),您可以使用预渲染块的数组。
答案 2 :(得分:0)
你最好的办法是创建一个代理视图来制作当前你的AJAX请求,像javascript那样处理结果,然后返回你想从Django模板系统获得的任何内容。
然后,您可以调用自己的视图,而不是进行当前正在进行的AJAX调用。 Django在视图中进行处理,你可以对返回到你的javascript的内容进行细粒度控制,并且它仍然只是一个(客户端)服务器调用。