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

3xiyfsfu  于 2023-07-01  发布在  Go
关注(0)|答案(9)|浏览(203)

我必须根据当前URL动态构建一个URL。使用{% url %}标记是最简单的方法,但是我需要当前的url名称来动态生成新的url名称。
如何获取指向当前视图的urlconf的url名称?
编辑:我知道我可以用get_absolute_url手工制作url,但我宁愿避免它,因为它是讲座的一部分,我只想演示一种构建url的方法。
学生们知道如何使用{% url %}。当他们必须基于当前URL生成更完整的URL时,他们知道面临着一个问题。最简单的方法是再次使用{% url %},并进行一些修改。因为我们已经命名了url,我们需要知道如何获取调用当前视图的url的名称。
编辑2:另一个用例是根据基础模板不同地显示基础模板的部分。还有其他方法可以做到这一点(使用CSS和{% block %},但有时候,如果viewname与链接匹配,则可以删除base.html的菜单项的标记。

rkttyhzu

rkttyhzu1#

我不知道这个特性在Django中已经存在了多久,但正如下面的文章所示,它可以在视图中实现如下:

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

如果您需要在每个模板中使用此功能,编写模板请求可能是合适的。

编辑:应用新的Django更新

Django更新:

Django 1.10(link)

不赞成从django.core.urlresolvers模块导入,而支持其新位置django.urls

Django 2.0(link)

删除了django.core.urlresolvers模块,以支持其新位置django.urls
正确的做法是这样的:

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

e4yzc0pl2#

从Django 1.5开始,这可以从request对象访问

current_url = request.resolver_match.url_name

如果您想要url名称沿着命名空间

current_url = request.resolver_match.view_name

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

ut6juiuv

ut6juiuv3#

对于那些命名他们的url模式,那么你可能会对请求的命名空间url名称感兴趣。在这种情况下,Django将其称为view_name

request.resolver_match.view_name

# return: <namespace>:<url name>
tyg4sfes

tyg4sfes4#

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

request.resolver_match.url_name
  • Django >1.8*
uurity8g

uurity8g5#

试试request.path。这将获取当前请求的路径。

8e2ybdfx

8e2ybdfx6#

澄清问题:“在视图中,如何获取指向它的urlpattern的名称,假设恰好有一个这样的urlpattern。”
这可能是可取的,原因如下:在视图中,我们需要一种DRY方式来获取同一视图的URL(我们不想知道自己的urlpattern名称)。
简短回答:这并不简单到足以教你的课,但它可能是一个有趣的事情,你在一两个小时内做,并在GitHub上呕吐。
如果你真的想这样做,你必须子类化RegexURLResolver并修改resolve方法以返回匹配的模式(从中你可以得到模式名称),而不是视图和关键字/值对。http://code.djangoproject.com/browser/django/trunk/django/core/urlresolvers.py#L142
然后,您可以创建一个装饰器,或者更合适的中间件,使用这个子类来获取模式名称,并将该值存储在请求中的某个位置,以便视图可以使用它。
如果你真的想这样做,你遇到了一些麻烦,让我知道,我可能会帮助。
对于您的类,我只需要让他们在视图或模板中硬编码模式名称。我相信这是可以接受的做法。

**更新:**我越想这个问题,我就越不鼓励尝试在视图中获取urlpattern名称。URLpattern参数与它们所指向的视图的参数相当独立。如果你想指向某个url,你需要知道urlpattern是如何工作的,而不仅仅是视图是如何工作的。如果您需要知道URLpattern是如何工作的,那么您还不如知道URLpattern的名称。

nhjlsmyf

nhjlsmyf7#

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

omqzjyyz

omqzjyyz8#

要获取绝对URL,请按以下方式操作:

request.build_absolute_uri()

如果你想在主URL(不是当前URL)的末尾添加一些额外的东西,请按以下方式操作:

request.build_absolute_uri("/something/")

如果你想得到唯一的主域URL,请按以下步骤操作:

request.build_absolute_uri("/")
643ylb08

643ylb089#

从你的问题来看,这有点不清楚,但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匹配的模式处停止。
    1.一旦其中一个正则表达式匹配,Django就会导入并调用给定的视图,这是一个简单的Python函数。该视图将传递一个HttpRequest作为其第一个参数,并将正则表达式中捕获的任何值作为其余参数。
    如果你只是在完整路径之后,你可以尝试:
    http://docs.djangoproject.com/en/dev/ref/request-response/#django.http.HttpRequest.get_full_path
    我希望这能有所帮助-它指出了如何使用URLconf模块,并希望能帮助您指出正确的方向。

相关问题