我必须根据当前URL动态构建一个URL。使用{% url %}
标记是最简单的方法,但是我需要当前的url名称来动态生成新的url名称。
如何获取指向当前视图的urlconf的url名称?
编辑:我知道我可以用get_absolute_url
手工制作url,但我宁愿避免它,因为它是讲座的一部分,我只想演示一种构建url的方法。
学生们知道如何使用{% url %}
。当他们必须基于当前URL生成更完整的URL时,他们知道面临着一个问题。最简单的方法是再次使用{% url %}
,并进行一些修改。因为我们已经命名了url,我们需要知道如何获取调用当前视图的url的名称。
编辑2:另一个用例是根据基础模板不同地显示基础模板的部分。还有其他方法可以做到这一点(使用CSS和{% block %},但有时候,如果viewname与链接匹配,则可以删除base.html的菜单项的标记。
9条答案
按热度按时间rkttyhzu1#
我不知道这个特性在Django中已经存在了多久,但正如下面的文章所示,它可以在视图中实现如下:
如果您需要在每个模板中使用此功能,编写模板请求可能是合适的。
编辑:应用新的Django更新
Django更新:
Django 1.10(link)
不赞成从
django.core.urlresolvers
模块导入,而支持其新位置django.urls
Django 2.0(link)
删除了
django.core.urlresolvers
模块,以支持其新位置django.urls
。正确的做法是这样的:
e4yzc0pl2#
从Django 1.5开始,这可以从request对象访问
如果您想要url名称沿着命名空间
https://docs.djangoproject.com/en/stable/ref/request-response/#django.http.HttpRequest.resolver_match
ut6juiuv3#
对于那些命名他们的url模式,那么你可能会对请求的命名空间url名称感兴趣。在这种情况下,Django将其称为
view_name
。tyg4sfes4#
这可以通过以下方式实现:
uurity8g5#
试试
request.path
。这将获取当前请求的路径。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的名称。
nhjlsmyf7#
http://docs.djangoproject.com/en/dev/ref/request-response/#django.http.HttpRequest.get_full_path
omqzjyyz8#
要获取绝对URL,请按以下方式操作:
如果你想在主URL(不是当前URL)的末尾添加一些额外的东西,请按以下方式操作:
如果你想得到唯一的主域URL,请按以下步骤操作:
643ylb089#
从你的问题来看,这有点不清楚,但http://docs.djangoproject.com/en/dev/topics/http/urls/可能会为你所追求的东西提供一个解释。
特别有用的是注意Django如何处理请求:
当用户从Django支持的站点请求页面时,系统会遵循以下算法来确定要执行哪些Python代码:
1.一旦其中一个正则表达式匹配,Django就会导入并调用给定的视图,这是一个简单的Python函数。该视图将传递一个HttpRequest作为其第一个参数,并将正则表达式中捕获的任何值作为其余参数。
如果你只是在完整路径之后,你可以尝试:
http://docs.djangoproject.com/en/dev/ref/request-response/#django.http.HttpRequest.get_full_path
我希望这能有所帮助-它指出了如何使用URLconf模块,并希望能帮助您指出正确的方向。