View

作者: 流蓝浅 | 来源:发表于2018-04-12 17:00 被阅读0次

     视图接受Web 请求并且返回 Web 响应
     视图就是一个python 函数,被定义在 views.py 中
     响应可以是一张网页的 HTML 内容,一个重定向,一个 404 错误等等

    URLconf

     在Django框架中,提供了非常清晰简洁的url管理方法
     在项目文件夹下settings.py 文件中通过ROOT_URLCONF 指定根级 url 的配置
     新建一个Django project之后,在项目文件夹urls.py中的urlpatterns列表中来配置 url,
    每一个列表项就是一个由url函数的调用。
     urlpatterns 是一个 url 实例的列表
     django 的 url 配置有效的降低了后台和页面的耦合度

    url()方法

     def url(regex, view, kwargs=None, name=None)
    o regex :正则表达式
    o view:视图函数
    o name: 名称
    o name 用来唯一区分一个视图对应多个 urlconf 的场景
    o kwargs: 就是一个字典类型的参数
    o url(r'^archive-summary/(\d{4})/$', archive, {'summary': True}, "arch-summary"),
    o 视图函数中使用:
    def index(reqeust):
    booklist = BookInfo.books.all()
    return render(reqeust, 'booktest/index.html', {'req':reqeust,'booklist': booklist})
    功能:凡是与regex 匹配的 URL 请求都会执行到 url()函数中对应的第二个参数 view 代
    表的视图函数。
     模板链接中使用
    <a href="detail/{{book.id}}/">{{ book.btitle }}</a>
    <a href=" {{book.id}}/">{{ book.btitle }}</a>
     编写URLconf 的注意:

    o 不需要添加一个前导的反斜杠,如应该写作'booktest/',而不应该写作'/booktest/',否
    则意味着从根目录匹配
    o 表单action 的 url 除外,要有前导的反斜杠
    o 每个正则表达式前面的 r 表示字符串不转义
     请求的url 被看做是一个普通的 python 字符串,进行匹配时不包括 get 或 post 请求的
    参数及域名
    http://www.qikuedu.com/python/1/?i=1&p=new,只匹配“python/1/”部分
     性能:urlpatterns 中的每个正则表达式在第一次访问它们时被编译,这使得系统相当快

    包含其它的URLconfs
    include方法
    假设我们在booktest 模块中定义了一个 index 页面,想通过
    "http://localhost:8000/booktest/index"来访问

    1. 首先我们在 view.py 中定义index 函数:
      def index(reqeust):
      booklist = BookInfo.books.all()
      return render(reqeust, 'booktest/index.html', {'booklist': booklist})
    2. 然后在应用的 urls.py 的 urlpatterns 列表中添加一个 url 配置:

    urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^index/$', views.index),
    ]
    然后运行:通过"http://localhost:8000/booktest/index"来访问
    新的问题:但假如一个 project 中有多个 app,用以上的方式来管理 url 可能会造成比较
    混乱的局面
    为了解决这个问题,我们可以用 include 的方法来配置 url
    include(arg, namespace=None)
    参数1:包含booktest 应用的urlconf
    参数2:定义命名空间,用于反解析
     命名空间(英语:Namespace)是表示标识符的可见范围。
     一个标识符可在多个命名空间中定义,它在不同命名空间中的含义是互不相干的。
     这样,在一个新的命名空间中可定义任何标识符,它们不会与任何已有的标识符发生冲突,
    因为已有的定义都处于其它命名空间中。
    多个urlconf的使用

    1. 在应用中创建 urls.py 文件,定义本应用中的 urlconf

    2. 再在项目的url.py 中使用 include() 包含应用 app 的 urlconf
      from django.conf.urls import include, url
      urlpatterns = [
      url(r'^', include('booktest.urls', namespace='booktest')),# 包含booktest 应用的
      urlconf
      ]
       匹配过程:先与主 URLconf 匹配,成功后再用剩余的部分与应用中的 URLconf 匹配
      请求http://127.0.0.1:8000/booktest/1/
      在项目urls.py中的配置:
      url(r'^booktest/', include('booktest.urls', namespace='booktest')),
      url(r'^([0-9]+)/$', views.detail, name='detail'),
      匹配部分是:1/
      匹配过程:用“1/”与 booktest 应用的urls 匹配
       使用include 可以去除 urlconf 的冗余

    视图参数的传递

     正则表达式非命名分组,通过位置参数传递给视图
    url(r'^([0-9]+)/$', views.detail, name='detail'),
     正则表达式命名分组,通过关键字参数传递给视图,本例中关键字参数为 id

    url(r'^(?P<id>[0-9]+)/$', views.detail, name='detail'),
     参数匹配规则:优先使用命名参数,如果没有命名参数则使用位置参数
     每个捕获的参数都作为一个普通的 python 字符串传递给视图
     若要从url 中捕获一个值,需要在它周围设置一对圆括号
     参数:视图会收到来自父 URLconf、当前URLconf 捕获的所有参数

    URL的反向解析

     问题:如果在视图、模板中使用硬编码的链接,在 urlconf 发生改变时,维护非常麻烦
     解决:通过指向urlconf 的名称,根据正则表达式动态生成链接地址
     视图:使用django.urls.reverse()函数
    from django.urls import reverse
    from django.http import HttpResponseRedirect
    def test(reqeust, id):
    url name 的使用:
    return HttpResponseRedirect(reverse('booktest:detail', args=(1,)))
    说明:
    第一个参数:" bookTest: detail": ' booktest应用下的 name = detail 的函数。
    booktest应用url conf:
    url(r'^booktest/detail/([0-9]+)/$',views.detail,name='detail')
    第二个参数:self.pk会替代正则表达式里面的pk
    然后 reverse 函数去解析视图函数对应的URL。

     项目的 url conf:url(r'^', include('booktest.urls', namespace='booktest'))
    o 在模版中使用:
    o django2.x:
    o <a href="{% url 'booktest:detail' book.id %}">{{ book.btitle }}</a>
    o django 早期版本:
     <a href="{% url 'booktest.views.detail' book.id %}">{{ book.btitle }}</a>
    o 否则报错:
    o NoReverseMatch at /booktest/
    o Reverse for 'detail 2' not found. 'detail 2' is not a valid view function or
    pattern name.
     在 booktest 应用urls.py 中的配置
     app_name='app_name'

    相关文章

      网友评论

        本文标题:View

        本文链接:https://www.haomeiwen.com/subject/ielfkftx.html