zoukankan      html  css  js  c++  java
  • Django URL视图

    视图

    视图一般都写在app的 views.py中。并且视图的第一个参数永远都是request(一个HttpRequest)对象。返回值必须django.http.response.HttpResponseBase的子类的对象

    这个对象存储了请求过来的所有信息,包括携带的参数以及一些头部信息等。在视图中,一般是完成逻辑相关的操作。比如这个请求是添加一篇博客,那么可以通过request来接收到这些数据,然后存储到数据库中,最后再把执行的结果返回给浏览器。视图函数的返回结果必须是 HttpResponseBase 对象或者子类的对象。

    • views.py文件示例代码

        from django.http import HttpResponse
        def book_list(request):
        	return HttpResponse("书籍列表!")
      
    • urls.py文件做映射

        from django.urls import path
        from book import views
        urlpatterns = [
        	path('book/',views.book_list)
        ]
      

    视图参数

    url中包含了一些参数需要动态调整。比如简书某篇文章的详情页的url,是https://www.jianshu.com/p/a5aab9c4978e后面的a5aab9c4978e就是这篇文章的id,那么简书的文章详情页面的url就可以写成 https://www.jianshu.com/p/ ,其中id就是文章的id。

    指定参数形式

    • views.py示例代码:

        def book_detail(request,book_id):
        	text = "您输入的书籍的id是:%s" % book_id
        	return HttpResponse(text)
      
    • urls.py代码示例

        from django.contrib import admin
        from django.urls import path
        from book import views
        urlpatterns = [
        	path('admin/', admin.site.urls),
        	path('book/',views.book_list),
        	path('book/<book_id>/',views.book_detail)
        ]	
      

    访问127.0.0.1/book/1/即可。

    查询字符串形式

    • views.py示例代码

        def book_detail(request):        #注意!查询字符串形式不需要其他的参数
        	book_id = request.GET.get("id")  #id表示参数名称 也可以写成book_id = request.GET['id']
        	text = "您输入的书籍id是:%s" % book_id
        	return HttpResponse(text)
      
    • urls.py示例代码

        urlpatterns = [
        	path('admin/', admin.site.urls),
        	path('book/',views.book_list),
        	path('book/detail/',views.book_detail)
        ]
      

    访问127.0.0.1/book/detail/?id=1即可

    URL中包含另外一个urls模块

    在我们的项目中,不可能只有一个app,如果把所有的app的views中的视图都放在urls.py中进行映射,肯定会让代码显得非常乱。因此django给我们提供了一个方法,可以在app内部包含自己的url匹配规则,而在项目的urls.py中再统一包含这个app的 urls,使用这个技术需要借助include函数。

    	from django.contrib import admin
    	from django.urls import path,include
    	urlpatterns = [
    		path('admin/', admin.site.urls),
    		path('book/',include("book.urls"))
    	]
    

    简单的说就是把项目的urls.py通过include函数包含其他app的urls.py文件。

    Path函数

    path函数的定义为: path(route,view,name=None,kwargs=None)。

    • route参数

      route参数:url的匹配规则。这个参数中可以指定url中需要传递的参数

    • views参数

      视图的返回值

    • name参数

      这个参数是给这个url取个名字的,这在项目比较大,url比较多的时候用处很大。

    • kwargs参数

      有时候想给视图函数传递一些额外的参数,就可以通过kwargs参数进行传递。这个参数接收一个字典。传到视图函数中的时候,会作为一个关键字参数传过去。

        例如:
      
        from django.urls import path
        from . import views
        urlpatterns = [
        	path('blog/<int:year>/', views.year_archive, {'foo': 'bar'}),
        ]
      

      那么以后在访问 blog/2019/这个url的时候,会将foo=bar作为关键字参数传给 year_archive函数。

    URL命名

    • 为什么要给url命名?

      因为url是经常变化的,如果在代码中写死可能会经常改代码,给url取个名字,以后使用url的时候就使用他的名字进行反转。

    • 如何给一个url指定名称?

      在path函数中,传递一个‘name’参数即可,示例代码如下

        urlpatters = [
        	path('signin/',views.login,name ='login')
        ]
      
    • url反转

      上述示例代码name = 'login' 给url命名了。在views.py文件中就不需要写死参数,需要根据名字进行反转。

        from django.shortcuts import redirect,reverse
        ...
        ...
        return redirect(reverse('login'))
      

      这个代码的意思就是,通过login这个名字对应的url反转,反转之后的urls传递给redirect

      所以网页显示的就是/singin/

    • 应用命名空间

      有多个app之间,有可能产生同名的url。这时候为了避免反转url的时候产生混淆。可以使用应用命名空间来做区分。在app中的urls.py文件中可以指定命名空间。

      应用命名空间的变量是app_name = 'front'(示例)

      url进行反转的时候就可以这样写:'front:login',这样的话,django就会从front命名空间下的login。

  • 相关阅读:
    事务
    触发器
    SQL 存储过程
    SQL 视图 索引
    SQL 函数
    SQL查询语句练习
    SQL约束
    SQL Server 数据的添加修改删除和查询
    The type ProxyGenerator is not accessible due to restriction on required library问题的解决
    ==与equals
  • 原文地址:https://www.cnblogs.com/jiajiaba/p/10563312.html
Copyright © 2011-2022 走看看