使用Jquery附加Django模板标记

时间:2011-05-01 09:52:29

标签: javascript jquery django django-templates

我想构建一个菜单,我可以使用{%block%}标记设置一个突出显示的链接。我的Javascript中有类似的东西:

<loop>
$('#a-div').append('{% block ' + variable + ' %} <a href...</a> {% endblock %}')
<endloop>

在来源中,显示为“{%block Home%}”

如何让JQuery不将其作为字符串附加,而是作为模板标记?

3 个答案:

答案 0 :(得分:4)

你做不到。至少没有向Django模板发出AJAX请求。在您的情况下,它会很慢,并提出不必要的额外请求。这不值得。您可以使用例如jQuery load函数通过jQuery从Django模板插入片段。但是您无法替换特定的{% block %}标记,因为在jQuery运行时,模板已经被处理(并且对块标记的引用已被删除)。但这不是你在任何情况下应该这样做的情况。

为什么不用CSS类突出显示菜单?以下是我解决此问题的常用方法:

  1. 在您的base_extras.py个文件夹中创建名为templatetags的文件。如果您没有,请在适当的文件夹中创建一个。
  2. 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 ""
    
  3. 现在,在您的模板中,在基本模板的菜单上,执行以下操作:

    <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>
    
  4. 这将使您当前URL所在的菜单具有active类。然后,在CSS中,只需为active的菜单项添加一个特殊类,看起来与其他菜单略有不同。

    ul.menu li.active {background: red; color: white;}
    
  5. 如果你碰巧需要用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的内容进行细粒度控制,并且它仍然只是一个(客户端)服务器调用。