如何使用Django获取当前的url名称?

时间:2010-03-22 11:00:19

标签: django django-urls urlconf

我必须根据当前网址动态构建网址。使用{% url %}标签是最简单的方法,但我需要当前的网址名称来动态生成新的网址。

如何将url名称附加到指向当前视图的urlconf?

编辑:我知道我可以使用get_absolute_url手动手动编写网址,但我宁愿避免使用它,因为它是讲座的一部分,我想只展示一种构建网址的方法。

学生知道如何使用{% url %}。当他们必须基于当前的URL生成更完整的URL时,他们知道面临问题。最简单的方法是再次使用{% url %},但有一些变化。由于我们已将url命名为,因此我们需要知道如何获取调用当前视图的网址名称。

编辑2:另一个用例是根据基本模板显示部分基本模板。还有其他方法可以做到这一点(使用CSS和{%block%},但有时候,如果viewname与链接匹配,那么能够删除base.html菜单项的标记真的很棒。

8 个答案:

答案 0 :(得分:104)

我不知道这个功能已经成为Django的一部分,但正如following article所示,它可以在视图中实现如下:

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

如果您在每个模板中都需要,那么编写模板请求可能是合适的。

编辑:应用新的DJANGO UPDATE

遵循当前的Django更新:

Django 1.10 link

  

不推荐从django.core.urlresolvers模块导入   赞成其新位置django.urls

Django 2.0 link

  

删除django.core.urlresolvers模块以支持其新模块   location,django.urls

因此,正确的做法是:

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

答案 1 :(得分:98)

从Django 1.5开始,可以从请求对象

访问它
    current_url = request.resolver_match.url_name

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

答案 2 :(得分:20)

对于那些命名为url模式的人,您可能会对请求的命名空间URL名称感兴趣。在这种情况下,Django称之为view_name

request.resolver_match.view_name

# return: <namespace>:<url name>

答案 3 :(得分:8)

这可以通过以下方式实现:

request.resolver_match.url_name

Django&gt; 1.8

答案 4 :(得分:3)

澄清问题:“在视图中,如何获得指向它的url模式的名称,假设只有一个这样的url模式。”

由于所述原因,这可能是可取的:在视图中,我们想要一种干燥的方式来获取相同视图的URL(我们不想知道我们自己的url模式名称)。

简短的回答:教你的课程并不是很简单,但是在一两个小时内完成GitHub可能会很有趣。

如果您真的想要这样做,则必须继承RegexURLResolver并修改resolve方法以返回匹配的模式(从中可以获取模式名称),而不是视图和关键字/值对。 http://code.djangoproject.com/browser/django/trunk/django/core/urlresolvers.py#L142

然后,您可以创建一个装饰器或者更合适的中间件,它使用此子类来获取模式名称并将该值存储在请求中的某个位置,以便视图可以使用它。

如果你真的想这样做并遇到麻烦,请告诉我,我可能会帮忙。

对于您的课程,我只需要在视图或模板中对模式名称进行硬编码。我相信这是可以接受的方式。

<强>更新 我想的越多,我就越不愿意在视图中尝试获取urlpattern名称。 urlpattern参数完全独立于它们指向的视图的参数。如果要指向某个URL,则需要知道urlpattern的工作方式,而不仅仅是视图的工作方式。如果您需要知道urlpattern的工作原理,您可能还必须知道urlpattern的名称。

答案 5 :(得分:3)

只需尝试request.path。那将得到当前请求的路径。

答案 6 :(得分:1)

答案 7 :(得分:0)

你的问题有点不清楚,但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,并将正则表达式中捕获的任何值作为剩余参数传递。
  5. 如果您刚刚完成所有路径,可以尝试:

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

    我希望有所帮助 - 它表明如何使用URLconf模块,希望能帮助您指明正确的方向。