#python #django #django_admin #django_cms
Есть middleware который проверяет url на наличие префикса в адресе и редиректит, при его отсутствии, на адрес с префиксом. При этом заменяя значения в request так чтобы казалось что этого префикса нету. Всё работает хорошо, за исключением того что новые url генерируются без этого префикса, что приводит к избыточному редиректу. Есть ли какой-нибудь способ глобально переопределить методы для формирования url'ов, чтобы они формировались с нужным мне префиксом? Т.е. есть модель, которая зарегистрирована для редактирование в django админке, необходимо чтобы url'ы, которые генерирует сам django были сразу с префиксами. P.S. Префикс стоит перед сигнатурой языка, для этого и необходимо прикидываться. P.S.S. Модели могут быть не моего приложения и доступа к их коду у меня нету.
Ответы
Ответ 1
Насколько я понял, вы хотите что-то вроде этого: # 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" %}Ответ 2
Если в корневом urls.py проекта была конструкция вида urlpatterns = patterns('', ... ) , то можно заменить на old_urlpatterns = patterns('', ... ) urlpatterns = patterns('', url(r'^prefix/', include(old_urlpatterns)), )
Комментариев нет:
Отправить комментарий