Вопрос

Я должен динамически создавать URL-адрес в соответствии с текущим URL-адресом.Используя {% url %} тег - самый простой способ сделать это, но мне нужно текущее URL-имя, чтобы динамически генерировать новое.

Как я могу получить URL-имя, прикрепленное к urlconf, которое ведет к текущему представлению?

Редактировать :Я знаю, что могу вручную создать URL-адрес, используя get_absolute_url но я бы предпочел избежать этого, поскольку это часть лекции, и я хотел бы продемонстрировать только один способ создания URL-адресов.

Студенты знают, как использовать {% url %}.Они, как известно, сталкиваются с проблемой, когда им приходится генерировать более полный URL-адрес на основе текущего.Самый простой способ - это использовать {% url %} опять же, с некоторыми вариациями.Поскольку мы назвали url, нам нужно знать, как получить имя URL-адреса, который вызвал текущее представление.

ПРАВКА 2:другим вариантом использования является отображение частей базового шаблона по-разному в соответствии с базовым шаблоном.Есть и другие способы сделать это (используя CSS и {% block %}, но иногда просто приятно иметь возможность удалить тег пункта меню base.html если viewname совпадает со ссылкой.

Это было полезно?

Решение

Я не знаю, как долго эта функция была частью Django, но поскольку следующая статья показывает, что это может быть достигнуто следующим образом в представлении:

   from django.core.urlresolvers import resolve
   current_url = resolve(request.path_info).url_name

Если вам это нужно в каждом шаблоне, может быть уместно написать запрос на шаблон.

Редактировать:ПРИМЕНЕНИЕ НОВОГО ОБНОВЛЕНИЯ DJANGO

После текущего обновления Django:

Джанго 1.10 (Ссылка)

Импорт из django.core.urlresolvers модуль устарел в в пользу его нового расположения, django.urls

Джанго 2.0 (Ссылка)

В django.core.urlresolvers модуль будет удален в пользу новой расположение, django.urls.

Таким образом, правильный способ сделать это выглядит следующим образом:

from django.urls import resolve
current_url = resolve(request.path_info).url_name

Другие советы

Начиная с Django 1.5, к нему можно получить доступ из объекта запроса

    current_url = request.resolver_match.url_name

https://docs.djangoproject.com/en/dev/ref/request-response/#django.http .HttpRequest.resolver_match.... соответствие

Для тех, кто использует пространство имен для своих шаблонов URL-адресов, вас может заинтересовать URL-адрес запроса с пространством имен.В данном случае Django назвал это view_name вместо этого.

request.resolver_match.view_name

# return: <namespace>:<url name>

Это может быть достигнуто с помощью:

request.resolver_match.url_name

Django >1.8

Разъяснение вопроса:"В представлении, как вы получаете имя urlpattern, которое указывает на него, предполагая, что существует ровно один такой urlpattern".

Это может быть желательно по указанным причинам:из представления нам нужен ПРОСТОЙ способ получения URL-адреса к тому же представлению (мы не хотим знать наше собственное имя urlpattern).

Короткий ответ:На самом деле преподавать в своем классе недостаточно просто, но вам может быть интересно сделать это через час или два и забросить на GitHub.

Если бы вы действительно хотели это сделать, вам пришлось бы создать подкласс RegexURLResolver и изменить метод resolve, чтобы возвращать соответствующий шаблон (из которого вы можете получить имя шаблона) вместо пар view и ключевое слово / значение.http://code.djangoproject.com/browser/django/trunk/django/core/urlresolvers.py#L142

Затем вы могли бы создать декоратор или, возможно, более подходящее промежуточное программное обеспечение, которое использует этот подкласс для получения имени шаблона и сохранения этого значения где-нибудь в запросе, чтобы представления могли его использовать.

Если вы действительно хотите это сделать и столкнетесь с какими-то проблемами, дайте мне знать, и я, вероятно, смогу помочь.

Для вашего класса я бы просто попросил их жестко закодировать имя шаблона в представлении или шаблоне.Я считаю, что это приемлемый способ сделать это.

Обновить: Чем больше я думаю об этом, тем больше я бы отказался от попыток получить имя urlpattern в представлении.параметры urlpattern в значительной степени независимы от параметров представления, на которое они указывают.Если вы хотите указать на определенный URL-адрес, вам нужно знать, как работает urlpattern, а не только как работает представление.Если вам нужно знать, как работает urlpattern, вам также может потребоваться знать имя urlpattern.

Это немного неясно из вашего вопроса, но http://docs.djangoproject.com/en/dev/topics/http/urls/ скорее всего, это даст объяснение тому, что вам нужно.

Особенно полезно отметить, как Django обрабатывает запросы:

Когда пользователь запрашивает страницу с вашего сайта на базе Django, система следует этому алгоритму, чтобы определить, какой код Python выполнять:

  1. Django определяет корневой модуль URLconf для использования.Обычно это значение параметра ROOT_URLCONF, но если входящий объект HttpRequest имеет атрибут с именем urlconf (задается обработкой запроса промежуточным программным обеспечением), его значение будет использоваться вместо параметра ROOT_URLCONF.
  2. Django загружает этот модуль Python и ищет переменную urlpatterns.Это должен быть список Python в формате, возвращаемом функцией django.conf.urls.defaults.patterns().
  3. Django просматривает каждый шаблон URL по порядку и останавливается на первом, который соответствует запрошенному URL.
  4. Как только одно из регулярных выражений совпадает, Django импортирует и вызывает данное представление, которое представляет собой простую функцию Python.Представлению передается HttpRequest в качестве первого аргумента и любые значения, зафиксированные в регулярном выражении, в качестве остальных аргументов.

Если вам нужен только полный путь, вы можете попробовать:

http://docs.djangoproject.com/en/dev/ref/request-response/#django.http .HttpRequest.get_full_path.получить полный путь

Я надеюсь, что это поможет - это указывает, как использовать модуль URLconf, и, надеюсь, поможет указать вам правильное направление.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top