2011-03-08 132 views
0

我用django(来自Grails)推出了新特性,特别是您必须处理的所有自定义标签,而不是直接在模板中编写变量。Django自定义标签'takes_context'

嗯,我需要做的事情非常简单,但由于某种原因,我花了很长时间才完成。我想要做的是制作一个标签,检查给定的路径是否等于我的当前网址,然后返回该类如果为true。

<li class="{% check_url '/login/' 'current_page_item' %}"> 
    <a href="{% url social_login %}">login</a> 
</li> 

但是,问题来了,当我试图用takes_context注册标签:

陷入类型错误而渲染:simple_tag()得到了一个意想不到的关键字参数 'takes_context'

from django import template 

register = template.Library() 

@register.simple_tag(takes_context=True) 
def check_url(context, path, attr): 
     if context['request'].environ.get('PATH_INFO') == path: 
      return attr 
     else: 
      return '' 

我该如何解决它?另外,有没有更好的方法来做到这一点?

+2

你使用hte最新的开发版本的django(1.3.x?)或稳定的1.2.x?如果是这样,您不能以这种方式使用simple_tag - http://docs.djangoproject.com/en/dev/howto/custom-template-tags/。一个简单的快速方法可能是做一些像{%ifequal request.get_full_path'/ login /'%} class =“current_page”{%endif%}。 – user608133 2011-03-08 20:44:32

+1

我使用的是django 1.2.5,我之前尝试过使用快捷方式,但我将其移动到自定义标签以获得清晰视图。这个takes_context只适用于inclusion_tag(不是我想要的) – mateusmaso 2011-03-08 20:50:42

回答

1

另一种方法来做到这一点(和避免硬编码的网址):

{% url social_login as the_url %} 
{% ifequal the_url request.path %} 
.... 
{% endif %} 

或检查出像this东西!

1

这是因为takes_context仅可用于django 1.3