我正在尝试使用包含以下链接的模板:
<a href="{% url search query,page.previous_page_number %}">previous</a>
我试图在多种情况下使用它;换句话说,URL别名“搜索”需要指向不同的目标,具体取决于呈现模板的视图。
有没有办法将这样的别名传递给模板,以便以下(或类似)有效?:
direct_to_template(request, 'my_template.html', {'search': my_url_alias})
答案 0 :(得分:2)
据我所知,你不能,因为,由于我不理解的原因,url
标签不会将字符串作为输入参数。
您需要做的是根据django中url
templatetag的实现,使用变量作为第一个参数来推出自己的模板标记。
我使用这样的东西(根据你的意愿命名):
class NavUrlNode(Node):
def __init__(self, *args):
self.name_var = Variable(args[0])
self.args=[]
for ii in range(1,args.__len__()):
self.args.append(Variable(args[ii]))
def render(self, context):
name = self.name_var.resolve(context)
args=[]
for ii in range(self.args.__len__()):
args.append(self.args[ii].resolve(context))
return reverse(name, args=args)
@register.tag
def navigation_url(parser, token):
args = token.split_contents()
return NavUrlNode(*args[1:])
答案 1 :(得分:1)
Olivier的解决方案略有改进:
from django.template import Library, Node, Variable
from django.core.urlresolvers import reverse
register = Library()
class DynUrlNode(Node):
def __init__(self, *args):
self.name_var = Variable(args[0])
self.args = [Variable(a) for a in args[1].split(',')]
def render(self, context):
name = self.name_var.resolve(context)
args = [a.resolve(context) for a in self.args]
return reverse(name, args = args)
@register.tag
def dynurl(parser, token):
args = token.split_contents()
return DynUrlNode(*args[1:])
答案 2 :(得分:0)
knipknap的解决方案帮助了我很多,但是有一个小缺陷:每当你没有传递任何参数时,就会引发索引错误。要解决此问题,只需使用以下内容替换DynUrlNode的构造函数:
def __init__(self, *args): self.name_var = Variable(args[0]) try: self.args = [Variable(a) for a in args[1].split(',')] except IndexError: self.args = []