【问题标题】:Django: Dynamic URL alias in templatesDjango:模板中的动态 URL 别名
【发布时间】:2010-02-14 11:12:30
【问题描述】:

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

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

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

有没有办法将这样的别名传递给模板,以便以下(或类似的)工作?:

direct_to_template(request, 'my_template.html', {'search': my_url_alias})

【问题讨论】:

    标签: django url dynamic templates


    【解决方案1】:

    据我所知,您不能,因为出于某种我不明白的原因,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:])
    

    【讨论】:

    • 太棒了!谢谢。但是请注意,多个参数在您的解决方案中不起作用。我将添加另一个解决这些问题的答案(希望能让事情变得更简单一些)。
    【解决方案2】:

    以下是对 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:])
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2020-04-11
        • 1970-01-01
        • 1970-01-01
        • 2020-01-02
        • 2010-11-08
        • 1970-01-01
        • 2021-11-10
        • 2019-02-03
        • 2016-08-23
        相关资源
        最近更新 更多