Есть middleware который проверяет url на наличие префикса в адресе и редиректит, при его отсутствии, на адрес с префиксом. При этом заменяя значения в request так чтобы казалось что этого префикса нету. Всё работает хорошо, за исключением того что новые url генерируются без этого префикса, что приводит к избыточному редиректу.
Есть ли какой-нибудь способ глобально переопределить методы для формирования url'ов, чтобы они формировались с нужным мне префиксом? Т.е. есть модель, которая зарегистрирована для редактирование в django админке, необходимо чтобы url'ы, которые генерирует сам django были сразу с префиксами.
P.S. Префикс стоит перед сигнатурой языка, для этого и необходимо прикидываться.
P.S.S. Модели могут быть не моего приложения и доступа к их коду у меня нету.
Ответ
Насколько я понял, вы хотите что-то вроде этого:
# urls.py
from .views import PrefixUrlRedirect
old_urlpatterns = patterns('',
* * *
url(r'^some_view/$', some_view),
)
urlpatterns = patterns('',
url(r'^prefix', include(old_urlpatterns)),
url(r'^(\S+)', PrefixUrlRedirect.as_view())
)
# views.py
from django.views.generic.base import RedirectView
from django.shortcuts import Http404
class PrefixUrlRedirect(RedirectView):
query_string = True
def get_redirect_url(self, *args, **kwargs):
url_without_prefix = self.args[0]
if not url_without_prefix.find("prefix") + 1:
url = "".join(["/", "prefix", url_without_prefix])
return url
else:
# В случае, если url с префиксом не существует, вернём 404
raise Http404
При переходе на some_view/ перенаправит на prefixsome_view/
На prefixsome_view/ передаст управление в some_view
Обратите внимание: обязателен слеш в конце каждого URL
UPD Если очень хочется, можно посмотреть сюда, и переделать в виде мидлвари. Но смысла в этом не много.
UPD2 Вопрос изменился, отвечаю на его вторую часть.
Тут по сути два варианта:
1) Создать templatetag со своим формированием URL Смотрим как устроен штатный URL, смотрим как устроен reverse и вперёд
2) Генерировать URL в ручную
выбор за вами.
UPD3 Напишу подробнее:
Создаём template_tag:
# templatetags/my_templatetags.py
from django.core.urlresolvers import reverse
from django import template
register = template.Library()
@register.simple_tag
def my_url(url_name, prefix):
return prefix+reverse(url_name)
В шаблоне подключаем файл с тегом через:
{% load my_templatetags %}
Вызываем там, где нужен URL:
{% my_url "url-name" "prefix" %}
Комментариев нет:
Отправить комментарий