Подтвердить что ты не робот

Как получить текущее urlname с помощью Django?

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

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

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

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 3

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

request.resolver_match.view_name

# return: <namespace>:<url name>

Ответ 4

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

request.resolver_match.url_name

Django > 1.8

Ответ 5

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

Это может быть желательно по указанным причинам: изнутри представления нам нужен СУХОЙ способ получить URL-адрес для одного и того же представления (мы не хотим знать свое собственное имя URL-адреса).

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

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

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

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

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

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

Ответ 7

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

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

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

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

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

http://docs.djangoproject.com/en/dev/ref/request-response/#django.http.HttpRequest.get_full_path

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