Относительный редирект в Django - PullRequest
3 голосов
/ 27 сентября 2011

Конфигурация URL моего приложения в настоящее время выглядит следующим образом:

from django.conf.urls.defaults import patterns
from django.views.generic.simple import redirect_to

urlpatterns = patterns("myapp.views",
    (r"^$", redirect_to, {"url": "main/"}),
    (r"^(?P<title>.+)/$", "article"),
    ...
)

Это прекрасно работает, когда URL-адреса приложения используются без префикса.

Теперь я хочу включить URL-адреса моего приложенияв конфигурацию URL проекта с префиксом;вот так:

urlpatterns = patterns("",
    (r"^myapp/", include("myapp.urls")),
)

Но тогда http://myserver.org/myapp/ перенаправляется не на http://myserver.org/myapp/main/, а на http://myserver.org/main/.

Мне кажется, я понимаю, как это работает: шаблоны URL проектаполучить "myapp/".Это соответствует префиксу, который удаляется, оставляя "", который передается шаблонам приложения.Приложение не знает о зачистке и просто перенаправляет на main/, , который Django интерпретирует как /main/, который не работает для более глубоких вложенных URL-адресов (см. Правку ниже).

Каксказать Django перенаправить на URL-адрес относительно префикса приложения?


Редактировать: Ошибка!

Ааа!Приведенный выше код работает нормально, но мой браузер кэшировал постоянное перенаправление на предыдущий URL, который был "/main/".Я очистил свой кеш, и мой новый URL "main/" (который теперь является временным для предотвращения кеширования) работает просто отлично.Извините!

Но я понял, что ответ будет полезен, когда я захочу перейти по URL-адресу относительно корня приложения из более глубокого вложения: "relative/" может работать для http://myserver.org/myapp/foo/, но не для http://myserver.org/myapp/foo/bar/.

1 Ответ

2 голосов
/ 27 сентября 2011

В django 1.4 вы сможете использовать функцию reverse_lazy():

from django.core.urlresolvers import reverse_lazy
urlpatterns = patterns("myapp.views",
    (r"^$", redirect_to, {"url": reverse_lazy("myapp_title")}),
    (r"^(?P<title>.+)/$", "article", name="myapp_title"),
    ...
)

reverse_lazy() преобразуется в URL, которому была присвоена та же строка, что и "name"параметр, который предоставляется в качестве аргумента reverse_lazy().

Если вы работаете с более ранней версией, вам придется указать полный путь, что, конечно, нарушает принцип СУХОЙ:

(r"^$", redirect_to, {"url": "myapp/title/"}),
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...