代码之家  ›  专栏  ›  技术社区  ›  knipknap

django:模板中的动态URL别名

  •  3
  • knipknap  · 技术社区  · 15 年前

    我正在尝试使用包含以下链接的模板:

    <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 回复  |  直到 13 年前
        1
  •  2
  •   Olivier Verdier    15 年前

    据我所知,你不能,因为,出于某种原因,我不明白 url 标记不接受字符串作为输入参数。

    您需要做的是基于 网址 在Django中,使用变量作为第一个参数。

    我使用类似的东西(按你的意愿命名):

    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:])
    
        2
  •  1
  •   knipknap    15 年前

    奥利维尔的解决方案有一点改进:

    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:])
    
        3
  •  0
  •   Lukas Bünger    13 年前

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