2012-12-14 5 views
1

В моей Django URL, у меня есть много шаблонов URL, которые заканчиваются:Джанго изменить имя текущего URL и аргументы

(redirect/(?P<redirect_to>\w+)) 

Это означает, что эти адреса могут быть (или нет), заканчивая /redirect/TARGET/. Эти шаблоны URL имеют другие именованные аргументы (в основном одно: pk)

Теперь я хотел бы в шаблонах, используемых этими шаблонами URL, чтобы изменить текущий путь к странице, просто добавив аргумент redirect_to, и сохранение остальных аргументов и обратного имени URL нетронутым.

Мне удалось получить обратное имя URL в шаблоне, добавив resolve(path).url_name в текущий контекст, а затем использовать его с тегом шаблона {% url %}.

Хотелось бы узнать, есть ли простой способ динамически добавлять аргументы (от resolve(path).kwargs) к URL-адресу обратного тега?

+0

Не уверен, хотите ли вы этого '{% url url_name my_kwarg1 = 'any_value' my_kwarg2 = context_var%}' Ваш вопрос путается. –

+0

Я не уверен, что понимаю, что вы имеете в виду. Вы намерены добавить логику перенаправления к фактическому шаблону? –

+0

Моя первоначальная цель состояла в том, чтобы иметь три разных формы, каждая из которых перенаправлялась в разных местах, когда была отправлена ​​форма. Поэтому мне нужно было иметь способ получить измененный URL-адрес на странице, заканчивающейся/redirect/FOO. Тег шаблона, указанный в ответе, выполняет задание, однако я закончил работу над тем, что мне нужно было сделать, используя комбинацию имен кнопки отправки (атрибут имени кнопки отправки передается как пустой ключ на сервер при отправке формы) и переопределение get_success_url() в базовом FormView. – pistache

ответ

1

Я думаю, вы должны создать custom tag для этого (заменив тэг {% url%} на {% url_redirect "your_new_destination"%}).

в your_app/templatetags/my_custom_tags.py:

from django.core.urlresolvers import reverse, resolve 

@register.simple_tag(takes_context=True) 
def url_redirect(context, new_destination): 
    match = resolve(context.request.path) 
    match.kwargs['redirect_to'] = new_destination 
    return reverse(match.url_name, args=match.args, kwargs=match.kwargs) 

в шаблоне:

{% load my_custom_tags %} 
{% url_redirect "your_new_destination" %} 

Пожалуйста, обратите внимание, что вам нужно добавить 'django.core.context_processors.request' в ваш TEMPLATE_CONTEXT_PROCESSORS чтобы этот фрагмент работал.

Смежные вопросы