如何使用Django获取当前的urlname?

我必须根据当前的urldynamic地build立一个url。 使用{% url %}标记是最简单的方法,但是我需要使用当前的url名称来dynamic生成新的标记。

我如何获得连接到导致当前视图的urlconf的url名称?

编辑:我知道我可以手动使用get_absolute_url手工地址,但我宁愿避免它,因为它是一个演讲的一部分,我想演示只有一种方法来build立url。

学生知道如何使用{% url %} 。 他们知道面对一个问题时,他们必须产生一个更完整的url基于当前的一个。 最简单的方法是再次使用{% url %} ,并有一些变化。 由于我们已经命名了url, 我们需要知道如何获取调用当前视图的url的名称。

编辑2:另一个用例是根据基本模板différently显示部分基本模板。 还有其他方法可以做到这一点(使用CSS和{%block%}),但有时如果视图名称与链接相匹配,则可以移除base.html菜单项的标签。

我不知道Django的这个特性是多久,但是正如下面的文章所显示的那样,在视图中可以实现如下:

  from django.core.urlresolvers 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上。

如果你真的想这样做,你将不得不inheritanceRegexURLResolver,并修改resolve方法来返回匹配的模式(从中可以得到模式名称)而不是视图和关键字/值对。 http://code.djangoproject.com/browser/django/trunk/django/core/urlresolvers.py#L142

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

如果你真的想这样做,而且遇到麻烦,请告诉我,我可以帮忙。

对于你的class级,我只是让他们在模板名称视图或模板中硬编码。 我相信这是可以接受的做法。

更新:我越想这个,我越劝阻试图在视图中获得一个urlpattern名称。 urlpattern参数与它们指向的视图的参数相当独立。 如果你想指向一个特定的url,你需要知道urlpattern是如何工作的,而不仅仅是视图是如何工作的。 如果您需要知道urlpattern的工作方式,那么您不妨知道urlpattern的名称。

你的问题有点不清楚,但http://docs.djangoproject.com/en/dev/topics/http/urls/可能会提供一个解释。;

注意Django如何处理请求特别有用:

当用户从Django支持的站点请求页面时,系统会遵循这个algorithm来确定要执行的Python代码:

  1. Django确定要使用的根URLconf模块。 通常,这是ROOT_URLCONF设置的值,但是如果传入的HttpRequest对象具有名为urlconf(由中间件请求处理设置)的属性,则将使用其值替代ROOT_URLCONF设置。
  2. Django加载Python模块并查找variablesurlpatterns。 这应该是Python列表,格式为函数django.conf.urls.defaults.patterns()返回的格式。
  3. Django按顺序遍历每个URL模式,并停在与请求的URL匹配的第一个URL模式。
  4. 一旦一个正则expression式匹配,Django就会导入并调用给定的视图,这是一个简单的Python函数。 视图通过一个HttpRequest作为第一个参数,在正则expression式中捕获的任何值作为剩余的参数。

如果你只是完整的path,你可以尝试:

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

我希望这有帮助 – 它指出如何使用URLconf模块,并希望能帮助你指出正确的方向。