Django: псевдоним динамического URL в шаблонах - PullRequest
3 голосов
/ 14 февраля 2010

Я пытаюсь использовать шаблон, который содержит ссылку, такую ​​как:

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

Я пытаюсь использовать его в нескольких контекстах; другими словами, псевдоним URL «поиск» должен указывать на другую цель в зависимости от представления, которое отображает шаблон.

Есть ли способ передать такой псевдоним в шаблон, чтобы сработало следующее (или подобное):

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

Ответы [ 3 ]

2 голосов
/ 14 февраля 2010

Насколько я знаю, вы не можете, потому что по непонятной мне причине тег url не принимает строку в качестве входного аргумента.

Что вам нужно сделать, так эторазвернуть свой собственный тег шаблона, основанный на реализации тега шаблона 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:])
1 голос
/ 14 февраля 2010

Вот небольшое улучшение решения Оливье:

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 голосов
/ 14 июля 2011

Решение 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 = []
...