2011-05-01 106 views
2

我想建立一个菜单,我可以使用{%block%}标签突出显示一个链接。我在我的JavaScript是这样的:附加jquery的Django模板标签

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

在源,这是显示为“{%块主页%}”

我怎样才能让JQuery的不追加这个作为一个字符串,但作为模板标签?

回答

4

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

你为什么不用CSS类强调菜单?这是我平时解决这个问题:

  1. 创建一个在你templatetags文件夹的一个叫base_extras.py文件。如果您没有,请在适当的文件夹中创建一个。
  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;} 
    

如果你碰巧需要更改与jQuery的活动菜单,你可以删除所有菜单上的active类,并将其添加到新选择的菜单:

$('ul.menu li').removeClass('active').find('.home').addClass('active'); // for example 
+0

谢谢,我真的很喜欢这个解决方案。但它并不能真正解决我的问题。我应该更好地解释一下。我从ajax请求中获得菜单链接的名称和目标。所以在我的for循环中,我想使用菜单链接的名称作为块的名称。我这样做只是为了好玩,所以我意识到这可能是一件非常愚蠢的事情。 – kimpettersen 2011-05-01 11:23:19

+0

@Pecock:这是不可能的,AFAIK。唯一的方法是将jQuery请求发送到另一个Django模板,并通过'id'或'class'或其他方法将返回的内容插入正确的位置。但是,您将无法添加新块或使用jQuery在您的django代码中更新旧块。 – PeanutButterJelly 2011-05-01 11:30:16

+0

@Pecock:PBJ说什么。 – 2011-05-01 11:32:02

1

你不能那样做。在页面被发送到浏览器之前,Django模板标签在服务器端被处理。另一方面,在从服务器接收到页面之后,在浏览器中调用Javascript(包括jQuery)。

你可以做的是预渲染{% block %}标签到JS变量的内容和jQuery的代码中使用它:

var blockContent = "{% block Home %} ... {% endblock %}"; 
// ... 
$("#a-div").append(blockContent); 

如果你似乎在以表示需要多于一个街区(选择你提供的代码示例),你可以使用一系列的预渲染块。

0

最好的办法是创建一个代理视图,它使得当前的AJAX请求成为可能,处理JavaScript这样的结果,然后返回您试图从Django模板系统获取的任何内容。

然后,而不是使您目前正在进行的AJAX调用,而是调用您自己的视图。 Django在视图中进行处理,您可以对返回到JavaScript的内容进行细化控制,并且它仍然只有一个(客户端)服务器调用。