• 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)
      
      
  • 相关阅读:
    java 分割
    我就骂你了,我tm还想打你呢
    就两个人,怎么搞管理?
    年底得了个公司奖金,但是我却高兴不起来
    Microsoft.VisualStudio.TestTools.UnitTesting 命名空间
    Python2.7.6标准库内建函数
    几种xml读取方法比较
    无论怎么样都不能成为你对别人发脾气的理由
    【产品策划】在移动互联网时代的多媒体社交
    DES加密 超详解 及 C++编程实现
  • 原文地址:https://www.cnblogs.com/donghao1121/p/10398034.html
Copyright © 2020-2023  润新知