Страницы

Поиск по вопросам

четверг, 4 октября 2018 г.

Добавление префикса к url которые формирует django

Есть 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" %}

Комментариев нет:

Отправить комментарий