我必须根据当前网址动态构建网址。使用{% url %}
标签是最简单的方法,但我需要当前的网址名称来动态生成新的网址。
如何将url名称附加到指向当前视图的urlconf?
编辑:我知道我可以使用get_absolute_url
手动手动编写网址,但我宁愿避免使用它,因为它是讲座的一部分,我想只展示一种构建网址的方法。
学生知道如何使用{% url %}
。当他们必须基于当前的URL生成更完整的URL时,他们知道面临问题。最简单的方法是再次使用{% url %}
,但有一些变化。由于我们已将url命名为,因此我们需要知道如何获取调用当前视图的网址名称。
编辑2:另一个用例是根据基本模板显示部分基本模板。还有其他方法可以做到这一点(使用CSS和{%block%},但有时候,如果viewname与链接匹配,那么能够删除base.html菜单项的标记真的很棒。
答案 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代码:
如果您刚刚完成所有路径,可以尝试:
http://docs.djangoproject.com/en/dev/ref/request-response/#django.http.HttpRequest.get_full_path
我希望有所帮助 - 它表明如何使用URLconf模块,希望能帮助您指明正确的方向。