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)
    
    
原文地址:https://www.cnblogs.com/donghao1121/p/10398034.html