zoukankan      html  css  js  c++  java
  • Django中url()

    使用django的时候,如果我们希望我们编写的view可以被正常访问,就需要配置url。

    在django的官方文档中,url()的例子如下:

    polls/urls.py

    from django.conf.urls import url
    
    from . import views
    
    urlpatterns = [
        url(r'^$', views.index, name='index'),
    ]

    mysite/urls.py

    from django.conf.urls import include, url
    from django.contrib import admin
    
    urlpatterns = [
        url(r'^polls/', include('polls.urls')),
        url(r'^admin/', include(admin.site.urls)),
    ]

    首先给我们展示了,如何将 app 中的 url.py 加入到 project的 url.py中

    如上所示,通过使用导入的 include 就可以帮我们做到, 

    现在我们重点说一下 url() :

    url() 函数具有四个参数: regex(必需)、view(必需)、kwargs(可选)、name(可选)

    url(regex, view, kwargs=None, name=None)

    url()参数:regex

      这里其实是一个正则表达式,对应了URL模式。Django 从第一个正则表达式开始,依次将请求的URL 与 每个正则表达式进行匹配,知道找到匹配的那个位置。需要注意的是,这里的正则表达式不会匹配URL中 POST/GET 的参数和域名。例如:在http://www.epython.cn/myapp/ 请求中,URLconf 查找的是 myapp/ ;在http://www.epython.cn/myapp/?page=3 请求中,URLconf 查找的也是 myapp/ 。

    url()参数:view

      当django 找到一个匹配的正则表达式时,就会调用 view参数 指定的 视图函数,并将HttpRequest对象作为第一个参数,从正则表达式中 ”捕获“ 的其他值作为其他参数,传入到该试图函数中。如果正则表达式使用简单的捕获方式,值将作为位置参数传递;如果使用命名的捕获方式,值将作为关键字参数传递。

    from django.conf.urls import url
    from account import views
    
    urlpatterns = [
        url(r'^login/', views.login),   # 第一个参数是regex , 第二个参数是view
        url(r'^logout/', views.logout),
    ]

    url()参数:kwargs

    url(r'^login/', views.login, {'summary': True})
    
    对应的视图函数
    
    def login(request, summary):
        print(summary)
        return HttpResponse("Login Func.")

    url()参数:name

      name用来命名你的URL,这样你就可以在django的其他地方,尤其是模板中,通过名称来明确的引用这个URL,这个强大的特性可以让你,仅仅修改一个文件就可以改变全局的URL模式。

    url(r'^(?P<question_id>[0-9]+)/$', views.detail, name='detail'),

      name 可以简单的理解为给前面的regex参数起了一个别名,在regex 改变后,我们不用修改 Template 、views 或 model中的代码。

      来看一个简单的例子:

    #  url.py
    url(r'^plus/(d+)/(d+)/$', views.plus, name='plus'),
    
    #  index.html
    <a href="/plus/12/24/">计算 12+24</a>

    现在如果我们需要计算的话只需要访问 /plus/12/24/ 就可以了。

    有一天我们需要改变一下url 将  /plus/12/24/ 修改成  /12_plus_24/, 这样就会导致我们修改改了url.py之后,对应的Template、views 或 model中对应的地址也需要修改,需要修改的地方越多,我们付出的代价也就越大。

    而使用通过 name 参数,我们就可以解决这个问题。

    url.py
    url(r'^/(d+)_plus_(d+)/$', views.plus, name='plus'),
    
    index.html
    <a href="{% url 'plus' 12 24 %}">计算 12+24</a>

    注意: 从第一种方式 变成第二种方式,name 不能修改。

    URL中的namespace

    在真实的django项目中, 可能会有多个app(五个、十个、或者更多);这个时候需要区分URL中的app的名字。例如,polls 应用具有一个detail 视图,相同项目中的博客应用可能也有这样一个视图。当使用模板标签{% url %}时,人们该如何做才能使得Django知道为一个URL创建哪个应用的视图?

    这个时候就需要用到URLconf中的 namespace 。

    #  mysite/urls.py
    from django.conf.urls import include, url
    from django.contrib import admin
    
    urlpatterns = [
        url(r'^polls/', include('polls.urls', namespace="polls")),
        url(r'^admin/', include(admin.site.urls)),
    ]

    最初的index.html

    #  polls/templates/polls/index.html
    <li><a href="{% url 'detail' question.id %}">{{ question.question_text }}</a></li>

    修改后的index.html

    #  polls/templates/polls/index.html
    <li><a href="{% url 'polls:detail' question.id %}">{{ question.question_text }}</a></li>
  • 相关阅读:
    Java基本语法(一)
    JAVA菜鸟入门HelloWorld
    python 练习题-质数
    python 字符串转运算符
    python 提取不重复的整数
    python 句子逆序
    python 数字颠倒
    python 字符个数统计
    python 练习题-计算字符个数
    python int型正整数在内存中存储为1的个数
  • 原文地址:https://www.cnblogs.com/resn/p/6278600.html
Copyright © 2011-2022 走看看