Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django:模板中的动态URL别名_Django_Url_Dynamic_Templates - Fatal编程技术网

Django:模板中的动态URL别名

Django:模板中的动态URL别名,django,url,dynamic,templates,Django,Url,Dynamic,Templates,我正在尝试使用包含以下链接的模板: <a href="{% url search query,page.previous_page_number %}">previous</a> 据我所知,您不能,因为,出于我不理解的原因,url标记不接受字符串作为输入参数 您需要做的是根据django中urltemplatetag的实现,使用变量作为第一个参数,推出您自己的模板标记 我使用这样的东西(根据您的意愿命名): 以下是对Olivier解决方案的一点改进: from djan

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

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

据我所知,您不能,因为,出于我不理解的原因,
url
标记不接受字符串作为输入参数

您需要做的是根据django中
url
templatetag的实现,使用变量作为第一个参数,推出您自己的模板标记

我使用这样的东西(根据您的意愿命名):


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

knipknap的解决方案对我帮助很大,但是有一个小缺陷:只要不传递任何参数,就会引发索引错误。要克服此问题,只需将DynUrlNode的构造函数替换为以下内容:


杰出的谢谢但是,请注意,多个参数在您的解决方案中不起作用。我将添加另一个解决这些问题的答案(并希望使事情变得更简单)。
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:])
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:])
   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 = []