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。

转载于:https://www.cnblogs.com/jiajiaba/p/10563312.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值