Django:模板中动态URL别名

3

我正在尝试使用一个包含链接的模板,例如这样:

<a href="{% url search query,page.previous_page_number %}">previous</a>

我试图在多个上下文中使用它;换句话说,URL别名“search”需要指向不同的目标,具体取决于呈现模板的视图。

是否有一种方法可以将这样的别名传递到模板中,以便以下内容(或类似内容)起作用?

direct_to_template(request, 'my_template.html', {'search': my_url_alias})
3个回答

2
据我所知,你不能这样做,因为出于某种我不理解的原因,url标签不接受字符串作为输入参数。
你需要做的是基于Django中url模板标签的实现,使用变量作为第一个参数,自己编写一个模板标签。
我使用类似以下代码(可自由命名):
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:])

太好了!谢谢。请注意,您的解决方案中无法使用多个参数。我将添加另一个答案来解决这些问题(希望能使事情变得更简单)。 - knipknap

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:])

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 = []

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接