zoukankan      html  css  js  c++  java
  • url路由配置及渲染方式

    -- django的url规则

    django的路由系统
    当一个请求来到时
    1.首先到项目目录下的urls.py (根URLconf模块)中,查找路由规则
    2.根URLconf模块,里面定义了urlpatterns变量
    3.urlpatterns是一个(django.urls.path,django.urls.re_path 对象)列表
    4.按顺序运行每个url模式。在第一个匹配的模板停止
    5.一旦匹配,django 导入并调用给定的视图
    6.如果中间出错,或者没有匹配到,返回404

    -- path方法,捕获参数,路径转换器  

      -path(route,view,kwargs=None,name=None)
      -route 是一个字符串的url规则
      -view 是一个视图
      - kwargs 额外参数,传递给view,必须是一个字典
      - name url的命名

      -- 在url中捕获参数
      使用`<变量名>`可以捕获url中的值传递给视图
      ** 捕获的值是 字符串

    访问学生详情:

    views.py

    def detail(request,pk):
        return HttpResponse('学生id为%s的详情页'%pk)

    urls.py中添加

    path('detail/<int:pk>/', views.detail),   #int为对对象pk的约束条件,必须为整数。路径转换器

    结果如图:

    第二种解释,`<变量名>`可以捕获url中的值传递给视图,并且有多个值时是一一对应

    views.py如下:

    def detail(request,slug,pk):
        return HttpResponse('学生id为%s的详情页'%pk)

    urls.py

    path('detail/<int:pk>/<slug>/', views.detail),

    结果如图:

    3.使用别的符号,也可以访问例如:-

    path('detail/<int:pk>-<slug>/', views.detail),

    常用的转换器:
      -- str 匹配除了‘/’路径之外的所有字符串
      -- int 匹配任意整数
      -- slug 匹配任意ascii字符,加上连字符和下划线
      -- uuid 格式化id
      -- path 匹配任意非空字符

    -- 使用正则表达式 re_path(route,view,kwargs=None,name=None)
    python 中正则表达式的分组命名 格式:(?P<name>pattern)  分组按照关键字参数,不分组按照位置参数

     如上面所示,输入的变量没有限制,比如年份是4位数字,月份为1-12的数字。

    views.py

    def student(request,year,mon):
        return HttpResponse('%s年 %s报名的学生'%(year,mon))

    urls.py中

       re_path('student/(?P<year>d{4})/(?P<mon>d[1-12])/', views.student),  #两种方法都可以
        # re_path('students/(?P<year>d{4})/(?P<mon>[0-9]|1[0-2])/', views.student),

    结果如下:

    按照位置参数,容易出问题

    urls.py

      re_path('student/(d{4})/(d[1-12])/', views.student),

     views.py

    def student(request,mon,year):
        return HttpResponse('%s年 %s报名的学生'%(year,mon))

    结果如下:

    - django 搜索的是什么?
    只搜索路径,不搜参数,不搜索请求方法
    同一个url可以匹配到get post

     -- 包含其他URLconfs ,一个项目可能会有多个app,每个app拥有一个独立的urls,这样查找起来容易定位。他们的查找的源头都是从根urls开始的。

    如下:根urls.py的定义。其中teacher、student都是项目下的app目录。需要导入include模块

    from django.contrib import admin
    from django.urls import path,re_path,include
    
    urlpatterns = [
        path('admin/', admin.site.urls),
        path('teacher/', include('teacher.urls')),
        path('student/', include('student.urls')),
    ]

    项目teacher下的urls.py文件如下

    from django.contrib import admin
    from django.urls import path,re_path
    from . import views
    
    urlpatterns = [
        path('detail/<int:pk>/', views.detail),
        # path('detail/<int:pk>/', views.detail,kwargs={'pk':111}),
        # path('student/<int:year>/<int:mon>/', views.student),
        # re_path('student/(?P<year>d{4})/(?P<mon>d[1-12])/', views.student),
    ]

    目录结构如下:


    - 传递额外参数

      path re_path 方法中,传递一个kwargs的字典参数

      path('detail/<int:pk>/', views.detail,kwargs={'some':111}),
      在kwargs中传递的参数必须要传递给urls
      def detail(request,pk,some):

    urls.py中添加额外参数kwargs

    path('student/<int:year>/<int:mon>/', views.student,kwargs={'status':True}),

    视图views.py,视图中也必须传递额外参数【status】

    def student(request,year,mon,status):
        return HttpResponse('%s年 %s报名的学生'%(year,mon))

    结果如下:


    **** 当kwargs 中的key与url中捕获的key一致时候,以kwargs为准,如果放到主url中将会对下面所有的url路由起作用

    path('detail/<int:pk>/', views.detail,kwargs={'pk':111}),

    url命名(name)

    页面重定向,跳转页面,登录之后。某个操作之后  redirct
    --app_name 定义在app文件夹下的urlconf模块中
    app_name = 模块名

    from django.contrib import admin
    from django.urls import path,re_path
    from . import views
    app_name = 'teacher'    #模板名字,app名
    
    urlpatterns = [   #进行url命名
        path('index/', views.index,name='index'),
        path('detail/<int:pk>/', views.detail,name='detail'),
        path('student/<int:year>/<int:mon>/', views.student,kwargs={'status':True}),
        path('students/', views.students, name='students'),   

    views.py

    from django.shortcuts import render,redirect,reverse
    
    def index(request):
        return HttpResponse('这是我的第一个django项目')
    
    def login(request):
        return redirect(reverse('teacher:index'))  #使用redirect跳转,reverse反向解析。teacher:index (app名称:url名称)

    模板设置
    html源码写到模板文件中
    - 模板路径设置:
    setting里面设置,一般放置在项目根目录

    BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))#项目根目录

    TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [os.path.join(BASE_DIR,'templates')], #模板路径 'APP_DIRS': True, 'OPTIONS': { 'context_processors': [ 'django.template.context_processors.debug', 'django.template.context_processors.request', 'django.contrib.auth.context_processors.auth', 'django.contrib.messages.context_processors.messages', 'teacher.customer_context_processors.my_name' ], }, }, ]

    --渲染:
    第一种:

    from django.template.loader import get_template

    def index(request):
      # tp = get_template('teacher/index.html')
      # html = tp.render()
      # return HttpResponse(html)

    第二种:(一般使用此种方法)

    from django.shortcuts import render,redirect,reverse
    
    def index(request):
      return render(request,'teacher/index.html')

    reverse中也可以传递参数kwargs,可以从teacher/login跳转到/teacher/detail/12页面。

    from django.shortcuts import render,redirect,reverse
    
    def login(request):
        return redirect(reverse('teacher:detail',kwargs={'pk':12}))#使用redirect跳转,reverse反向解析。teacher:index (app名称:url名称)
    def detail(request,pk):
        return HttpResponse('学生id为%s的详情页'%pk)

  • 相关阅读:
    JVM 启动参数设置
    Linux文件分割与合并
    设置tomcat使用指定的jdk版本
    java字符编码
    HASH 哈希处理完数据导致数据集第一行数据缺失
    HASH 何时将key加载到h.definedata()中
    字符串 批量全角、半角转换
    SAS_正则表达式 字符意义
    正则表达式基础篇
    sas options有用的全局设置
  • 原文地址:https://www.cnblogs.com/taoge188/p/10575696.html
Copyright © 2011-2022 走看看