Понимание 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»?

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

  • объект формы не имеет атрибута 'cleaned_data'
  • Django: добавление строк встроенных форм без javascript
  • Импорт данных JSON в Django View / Template
  • Как порядок миксинов влияет на производный класс?
  • Как создать форму из json-схемы?
  • Добавление пользователей в группы в Django
  • Получение данных из формы и отображения в шаблоне
  • Django DoNotExist
  •  
    Interesting Posts for Van-Lav

    Как проверить, является ли строковый ввод числом?

    Ошибка: «CSRF-проверка завершилась неудачно. Request aborted. "При использовании jquery ajax с Django

    Как вставить строку в мою таблицу слияния Google, используя Python

    Уничтожение / удаление очереди () в Redis Queue (rq) программно

    Консоль Ipython в Spyder застряла на «подключении к ядру»

    Проблема с программой для аппроксимации значений sin и косинуса

    Получение исходного двоичного представления файла в Python

    Как я могу узнать, запущен ли мой скрипт python? (с использованием оболочки Cygwin или Windows)

    Как написать список в xlsx, используя openpyxl

    Сортировка списка кортежей в зависимости от двух элементов

    В python, когда потоки умирают?

    SocketServer.ThreadingTCPServer – не удается привязать адрес после перезагрузки программы

    Разбор гигантского файла журнала в Python

    Python – Тестирование абстрактного базового класса

    Запуск сценария Python на сервере PHP

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