zoukankan      html  css  js  c++  java
  • Django中url的反向查询

    明确几个概念:

    1. application namespace:
        正在部署的app的名称,一个app的多个实例应该具有相同的application namespace.
        可以通过在URLconf模块(urls.py)中设置app_name属性(与urlpatterns属性同级)来指定application namesapce.
      (在django2.0版本中必须设置app_name)
    2. instance namespace:
        表示app的一个特定的实例.它在当前项目中应该是唯一的.一个app可以有多个实例!
    3. 默认实例(default instance of application):
        instace namesapce与所属app的application namespace相同的实例
    4. 当前实例:
        使用reverse()函数的current_app参数可以指定当前应用.

    当要反向解析一个namespace URL(例如'polls:index')的时候,Django将切分名称为多个部分,然后按下面的步骤查找:

    通过django文档中的一个示例来说明,考虑polls应用有俩个实例'publisher-polls'和'author-polls':

    #urls.py
    from django.conf.urls import include, url
    
    urlpatterns = [
        url(r'^author-polls/', include('polls.urls', namespace='author-polls')),
        url(r'^publisher-polls/', include('polls.urls', namespace='publisher-polls')),
    ]
    
    from django.urls import path
    
    from . import views
    
    app_name = 'polls'
    urlpatterns = [
        path('', views.IndexView.as_view(), name='index'),
        path('<int:pk>/', views.DetailView.as_view(), name='detail'),
        ...
    ]
    

    根据以上设置,可以使用下面的查询:

    • 此时'polls:index'的namespace与当前app的application instance(及app_name)相匹配.如果其中一个实例是当前应用实例(current),例如正在渲染'author-polls'的detail视图,'polls:index'将解析到'author-polls'实例的index页面.下面的两种方式的结果都是'/author-polls/'
      在类视图中:
    reverse('polls:index', current_app=self.request.resolver_match.namespace)
    

    在模板中:
    {% url 'polls:index' %}

    • 如果没有当前实例(current),例如在站点的其它地方渲染一个页面.'polls:index'将解析到polls中最后一个注册的实例中.因为没有默认实例(instance namespace为'polls'的实例),将使用polls注册的最后一个实例.在这里将解析到'publisher-polls',因为它在urlpatterns的末尾.
    • 如果解析'author-polls:index',将直接定位到'author-polls'的index页面.因为此时的namesapce是'author-polls',不能与application namespace匹配,根据上面的流程将直接查找instance namespace.
    • 如果上面的app还有一个名为'polls'的默认实例,上面的第二种情况'polls:index'将解析到该默认实例,而不是urlpatterns中最后声明的实例.
  • 相关阅读:
    【LeetCode】Validate Binary Search Tree
    【LeetCode】Search in Rotated Sorted Array II(转)
    【LeetCode】Search in Rotated Sorted Array
    【LeetCode】Set Matrix Zeroes
    【LeetCode】Sqrt(x) (转载)
    【LeetCode】Integer to Roman
    贪心算法
    【LeetCode】Best Time to Buy and Sell Stock III
    【LeetCode】Best Time to Buy and Sell Stock II
    CentOS 6 上安装 pip、setuptools
  • 原文地址:https://www.cnblogs.com/thunderLL/p/8561205.html
Copyright © 2011-2022 走看看