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

如何使用Django获取当前url名称?,django,django-urls,urlconf,Django,Django Urls,Urlconf,我必须根据当前url动态构建url。使用{%url%}标记是最简单的方法,但是我需要当前的url名称来动态生成新的url 如何将url名称附加到导致当前视图的urlconf 编辑:我知道我可以使用get_absolute\u url手工制作url,但我宁愿避免使用它,因为这是讲座的一部分,我只想演示一种构建url的方法 学生们知道如何使用{%url%}。当他们必须基于当前url生成一个更完整的url时,他们知道自己面临一个问题。最简单的方法是再次使用{%url%},但有一些变化。由于我们已经命名

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

如何将url名称附加到导致当前视图的urlconf

编辑:我知道我可以使用
get_absolute\u url
手工制作url,但我宁愿避免使用它,因为这是讲座的一部分,我只想演示一种构建url的方法

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


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

您的问题有点不清楚,但可能会解释您的目的

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

当用户从Django支持的站点请求页面时,系统将按照以下算法确定要执行的Python代码:

  • Django确定要使用的根URLconf模块。通常,这是根URLconf设置的值,但如果传入的HttpRequest对象具有名为URLconf的属性(由中间件请求处理设置),则将使用其值代替根URLconf设置
  • Django加载该Python模块并查找变量urlpatterns。这应该是一个Python列表,格式由函数Django.conf.urls.defaults.patterns()返回
  • Django按顺序运行每个URL模式,并在与请求的URL匹配的第一个模式处停止
  • 一旦其中一个正则表达式匹配,Django将导入并调用给定的视图,该视图是一个简单的Python函数。该视图将作为第一个参数传递HttpRequest,并将正则表达式中捕获的任何值作为剩余参数传递
  • 如果您刚刚完成完整路径,您可以尝试:


    我希望这会有所帮助——它指明了如何使用URLconf模块,并希望能帮助您找到正确的方向。

    对问题的澄清:“从某种角度来看,假设正好有一个这样的urlpattern,您如何获得指向它的URLPern的名称。”

    出于以下原因,这可能是可取的:在视图中,我们希望以一种干燥的方式获得指向同一视图的url(我们不想知道自己的urlpattern名称)

    简短的回答:教你的课还不够简单,但对你来说在一两个小时内完成并在GitHub上呕吐可能是一件有趣的事情

    如果您真的想这样做,您必须将regexurlsolver子类化,并修改resolve方法以返回匹配的模式(从中可以获得模式名称),而不是视图和关键字/值对。

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

    如果你真的想这样做,并且遇到了一些麻烦,请告诉我,我可能会提供帮助

    对于您的类,我会让他们在视图或模板中硬编码模式名称。我相信这是可以接受的方法

    更新:
    对此我想得越多,我就越不鼓励尝试在视图中获取urlpattern名称。urlpattern参数与它们指向的视图的参数相当独立。如果要指向某个url,您需要知道urlpattern如何工作,而不仅仅是视图如何工作。如果您需要知道urlpattern如何工作,请您可能还需要知道urlpattern的名称。

    我不知道该功能作为Django的一部分有多长时间了,但如图所示,它可以在视图中实现如下:

       from django.core.urlresolvers import resolve
       current_url = resolve(request.path_info).url_name
    
    如果您在每个模板中都需要它,那么编写模板请求是合适的

    编辑:应用新的DJANGO更新

    在当前Django更新之后:

    Django 1.10

    中不推荐从
    django.core.urlResolver
    模块导入 支持它的新位置,
    django.url

    Django 2.0

    删除了
    django.core.urlResolver
    模块,以支持其新功能 位置,
    django.url

    因此,正确的做法是:

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

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

    current_url = request.resolver_match.url_name
    
    如果希望url名称与命名空间一起使用

    current_url = request.resolver_match.view_name
    

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

        request.resolver_match.url_name
    

    Django>1.8

    对于那些为其url模式命名的人,那么您可能对请求的命名url名称感兴趣。在本例中,Django将其称为
    view\u name

    request.resolver_match.view_name
    
    # return: <namespace>:<url name>
    
    request.resolver\u match.view\u name
    #返回::
    
    只需尝试
    请求.路径
    。这将获得请求的当前路径。

    谢谢,但我知道:-)我添加了一些解释以避免误解。我在搜索通过模板标记输出当前绝对url的方法时不断发现这个问题。。。如果你也在寻找它,它是:
    {{request.get\u full\u path}
    +1这并没有回答问题,但解决了其中提出的一个问题。为什么?据我所知,你的问题的一个关键部分是如何实现“既然我们已经命名了url,我们需要知道如何获取调用当前视图的url的名称。”…实际上,卢卡斯那天我脾气暴躁,并且