zoukankan      html  css  js  c++  java
  • django 第二课 url路由及模板渲染方式

    1.django的路由系统

    • 路由解析原理:
      当一个请求来到时:
      1.首先到项目目录下的urls.py (根URLconf模块)中,查找路由规则
      2.根URLconf模块,里面定义了 urlpatterns 变量
      3.urlpatterns 是一个(django.urls.path,django.urls.re_path 对象)列表
      4.按顺序运行每个url模式,在第一个匹配的模式停止
      5.一旦匹配,django导入并调用给定的视图
      6.如果中间出错,或者没有匹配到,返回404
    • path(route, view, kwargs=None, name=None)
    • route 是一个字符串的url规则
    from django.urls import path
    from . import views
    
    urlpatterns = [
        path('admin/', admin.site.urls),
        path('index/',views.index),
    
    ]
    
    • view 是个视图
      views试图里面的代码
    from django.http import  HttpResponse
    
    def index(request):
        return HttpResponse('hello,这是我的第一个django!')
    

    可以通过http://127.0.0.1:8000/index/
    'hello,这是我的第一个django!'

    • kwargs 额外参数,传递给view,必须是一个字典
      • name url的命名
    • 在url中捕获参数
      在url规则中使用<变量名>可以捕获url中的值
      传递给视图
      ** 捕获的值是 字符串
    from django.urls import path
    from . import views
    
    urlpatterns = [
        path('admin/', admin.site.urls),
        path('index/',views.index),
        path('detail/<pk>/',views.detail)
    
    ]
    

    可通过访问 http://127.0.0.1:8000/detail/2/
    结果为
    学生id为2
    两个参数的时候可以这样写

    urlpatterns = [
        path('admin/', admin.site.urls),
        path('index/',views.index),
        path('detail/<pk>/<slug>/',views.detail)
    
    ]
    

    也可以这样写

    • 路径转换器

      案例:<int:pk>  
      
      常用的装换器:  
      	- str 匹配除了‘/'路径分隔符之外的所有字符串  
      	- int 匹配任意整数
      	- slug 匹配任意ascii字符 加上连字符和下划线
      	- uuid 格式化id
      	- path 匹配任意非空字符
      
    from django.urls import path
    from . import views
    
    urlpatterns = [
        path('admin/', admin.site.urls),
        path('index/',views.index),
        path('detail/<int:pk>/<slug>/',views.detail)
    
    ]
    
    • re_path方法 (route, view, kwargs=None, name=None)
    (route, view, kwargs=None, name=None)urlpatterns = [
        path('admin/', admin.site.urls),
        path('index/',views.index),
        path('detail/<int:pk>/<slug>/',views.detail),
        re_path(r'students/(?P<year>d{4})/(?P<month>[0-9] |1[0-2])/',views.students),
    
    ]
    
    • django 搜索 url 搜索的是什么?
      只搜索路径部分,跟参数,以及请求方法(get,post)无关 同一个url 可以匹配 get, post

    • 包含其他URLconfs

      ​ include 包含

      ​ 根url.py设置

      urlpatterns = [
          path('admin/', admin.site.urls),
      
          path('teacher/',include('teacher.urls'))
      ]
      

      ​ app的teacher下url.py设置

      from django.urls import path,re_path
      from . import views
      
      urlpatterns = [
          path('index/',views.index),
          path('detail/<int:pk>/<slug>/',views.detail),
          re_path(r'students/(?P<year>d{4})/(?P<month>[0-9] |1[0-2])/',views.students),
      
      ]
      

      ​ teacher.py 里面的views设置

      from django.shortcuts import render
      
      # Create your views here.
      from django.http import  HttpResponse
      
      def index(request):
          return HttpResponse('hello,这是我的第一个django!')
      def detail(request,pk,slug):
              return  HttpResponse('学生id为%s的详情页'%pk)
      
      def students(request,year,month):
          return HttpResponse('%s年%s月报名的学生列表'%(year,month))
      

      ​ 这时候访问之前的链接需要添加teacher

      1550374361420

      1550374379941

    • kwargs 额外参数

      ​ path, re_path方法中,传递一个kwargs的额外参数

      ​ urls.py里面设置一个字典参数 kwargs={'status':True}

      urlpatterns = [
          path('admin/', admin.site.urls),
      
          path('index/',views.index),
          path('detail/<int:pk>/<slug>/',views.detail,kwargs={'status':True}),
          re_path(r'students/(?P<year>d{4})/(?P<month>[0-9] |1[0-2])/',views.students),
      
      ]
      
      

      ​ views 里面需要接收urls.py传递过来的kwargs

      def detail(request,pk,slug,status):
          if status == True:
              return  HttpResponse('学生id为%s的详情页'%pk)
          else:
              return HttpResponse('没有参数status')
      
      
      

      ***** 当kwargs 中的key与url中key一致的时候,以kwargs为准

      urlpatterns = [
          path('admin/', admin.site.urls),
      
          path('index/',views.index),
          path('detail/<int:pk>/<slug>/',views.detail,kwargs={'pk':10}),
          re_path(r'students/(?P<year>d{4})/(?P<month>[0-9] |1[0-2])/',views.students),
      
      ]
      

      1550373273031

      ​ 不管pk为何值,结果都是kwargs默认的10

      kwargs在include中传递相当于把kwargs参数传递到相应app中所有的url。都添加了kwargs参数

    • url命名 :

      ​ 页面重定向,可以通过导入 redirect 方法 重定向

      from django.shortcuts import render,redirect
      
      # Create your views here.
      from django.http import  HttpResponse
      
      def index(request):
          return redirect('https://baidu.com')
      

      ​ 跳转到指定的页面(锚点):

      def index(request):
          return HttpResponse('这是index页面')
      def login(request):
          return redirect('/teacher/index')
      

      ​ name 命名

      ​ 如果url路径修改,这是可以通过name指定具体的名字,

      from django.urls import path,re_path
      from . import views
      app_name = 'teacher'
      urlpatterns = [
          path('home/',views.index , name = 'index'),
          path('login/',views.login ),
          path('detail/<int:pk>/<slug>/',views.detail),
          re_path(r'students/(?P<year>d{4})/(?P<month>[0-9] |1[0-2])/',views.students),
      
      ]
      
      

      views 需要导入reverse 方法,直接指定到name定义的变量, 如何多个app中出现相同的变量,可以通过在urlconf中设置

      app_name

      ​ 定义在 app文件夹下的urlconf模块中
      ​ app_name = app名称

      from django.shortcuts import render,redirect,reverse
      
      # Create your views here.
      from django.http import  HttpResponse
      
      def index(request):
          return HttpResponse('这是index页面')
      def login(request):
          url = reverse('teacher:index')
          return redirect(url)
      
      

    2.django模板

    ​ html源码卸载模板文件中

    • 模板设置-路径设置

      setting.py里面设置 DIRS , BASE_DIR 当前目录

      templets 你创建的模板文件夹

      TEMPLATES = [
          {
              'BACKEND': 'django.template.backends.django.DjangoTemplates',
              'DIRS': [os.path.join(BASE_DIR,'templets')],
              'APP_DIRS': True,
              'OPTIONS': {
                  'context_processors': [
                      'django.template.context_processors.debug',
                      
                      
      
      

      模板文件调用

      需要设置views.py 导入 template

      from django.template.loader import get_template
      
      

      ​ 然后用方法get_template 调用具体的文件

      通过render 方法渲染,最后返回HttpResponse(html)

      from django.shortcuts import render,redirect,reverse
      from django.template.loader import get_template
      
      # Create your views here.
      from django.http import  HttpResponse
      
      def index(request):
          tp = get_template('teacher/index.html')
          html = tp.render()
          return HttpResponse(html)
      
      
  • 相关阅读:
    python 全栈开发,Day21(抽象类,接口类,多态,鸭子类型)
    python 全栈开发,Day20(object类,继承与派生,super方法,钻石继承)
    python 全栈开发,Day19(组合,组合实例,初识面向对象小结,初识继承)
    python 全栈开发,Day18(对象之间的交互,类命名空间与对象,实例的命名空间,类的组合用法)
    python 全栈开发,Day17(初识面向对象)
    python 全栈开发,Day16(函数第一次考试)
    python 全栈开发,Day15(递归函数,二分查找法)
    python 全栈开发,Day14(列表推导式,生成器表达式,内置函数)
    python 全栈开发,Day13(迭代器,生成器)
    python 全栈开发,Day12(函数的有用信息,带参数的装饰器,多个装饰器装饰一个函数)
  • 原文地址:https://www.cnblogs.com/donghao1121/p/10398034.html
Copyright © 2011-2022 走看看