Понимание django.shortcuts.redirect

У меня есть пара проблем, которые понимают, как redirect или, наоборот, reverse работать.

В главном urls.py у меня есть:

 from django.conf.urls import patterns, include, url from django.views.generic.simple import redirect_to urlpatterns = patterns('', url(r'^$', redirect_to, {'url': '/monitor/'}), url(r'^monitor/', include('monitor.urls')), ) 

и в monitors.urls Я имею:

 from django.conf.urls import patterns, include, url urlpatterns = patterns('monitor.views', (r'^$', 'index'), (r'^abc/(?P<id>.*$)', 'abc'), ) 

Когда вы вызываете /monitor я хочу перенаправить его на /monitor/abc поэтому я сделал:

 def index(request): return redirect("abc") def abc(render, id=None): return render_to_response("monitor/list.htmld", {}) 

Но я получил исключение NoReverseMatch . Но когда я сделаю:

 def index(request): return redirect("abc/") 

то он внезапно работает.

Я не могу понять, почему. Почему reverse сбой с abc но не с abc/ ? И как reverse знает, что перенаправление должно включать в себя monitor/ ? Что, если бы я был в главном urls.py другом приложении, называемом xyz который также имеет вид abc ?

One Solution collect form web for “Понимание django.shortcuts.redirect”

Почему обратный сбой был «abc», но не с «abc /»?

Поскольку он интерпретировал его как имя вида (и у вас действительно есть вид с именем 'abc' , см. Файл monitor.urls ). Это означает, что Django вызовет reverse чтобы вычислить URL. Значение abc/ интерпретируется как фактический URL, что означает, что Django не будет вызывать reverse чтобы определить URL.

Это также объясняет, почему reverse не удалось: представление с именем abc также требует аргумента с именем id . В противном случае Django не сможет найти URL-адрес, так как нет никакого вида, называемого abc без параметров.

На основе документации вы сможете изменить URL-адрес, используя:

 redirect("abc", id=...) 

где ... – значение параметра id .

И как обратное знает, что перенаправление должно включать в себя монитор /?

Это связано с тем, что он знает, какие URL-адреса доступны, и 1) он знает, где определено представление с именем abc и 2) он знает, что monitors.urls включен с monitor/ спереди.

Что, если бы у меня было в главном urls.py другое приложение под названием «xyz», которое также имеет вид «abc»?

В этом случае вам нужно использовать пространства имен .

Interesting Posts

Matplotlib останавливает анимацию после первого кадра

автозаполнение файла pathpath с использованием ввода пользователей

Есть ли выражение для бесконечного генератора?

в Python, Как присоединиться к списку кортежей в один список?

Эффективно создавать редкие сводные таблицы в пандах?

Сортировка dict по суб-значению в Python

Импорт Python из каталога выше

Импортируйте модуль или добавьте путь один раз навсегда в python

Связи Python pyobbc с IBM Netezza Erroring

обновить базу данных django, чтобы отразить изменения в существующих моделях

Извлечение содержимого текстового содержимого таблицы с помощью xpath в строках для потребления?

может WSGI получить полный URL, а не просто: environ ? .. если так .. Mod_Rewrite альтернатива?

Преобразовать имя файла в файл: // URL

Как напечатать строку, за которой следует результат функции в Python

Выполнение кода для пользовательской страницы Django 404

Python - лучший язык программирования в мире.