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中最后声明的实例.
  • 相关阅读:
    错误论:错误是人类实践结果的一种状态,是实践的一个中间环节
    逻辑思维
    正确与错误、真理与谬误
    正确的判断,来自于错误的判断
    PHP+MySQL实现对一段时间内每天数据统计优化操作实例
    centos linux ip地址无法连接数据库,ssh登录服务器时必须使用22端口
    如何更改linux文件目录拥有者及用户组
    navicat ssh通道受限问题处理
    Navicat for MySQL 使用SSH方式链接远程数据库(二)
    Navicat for MySQL 使用SSH方式链接远程数据库
  • 原文地址:https://www.cnblogs.com/thunderLL/p/8561205.html
Copyright © 2011-2022 走看看