zoukankan      html  css  js  c++  java
  • django额外参数的传递和url命名

    django额外参数的传递


    path方法:path(route, view, kwargs=None, name=None)

    • path方法可以传递入一个额外参数的字典参数(kwarg),字典里的值就会被传给视图函数。
    • 传入的字典里的key必须在视图函数的参数里,否则会报错。
    • 当字典参数里的key和url捕获的参数一致时,以额外参数(kwargs)里的为准。
      1 from django.urls import path
      2 from .views import *
      3 
      4 urlpatterns = [
      5     path('index/<pk>/', index, kwargs={'pk': 20,'id': 30,}),
      6 ]

      传入额外参数

      1 from django.shortcuts import render, HttpResponse
      2 
      3 # Create your views here.
      4 
      5 
      6 def index(request, pk, id):
      7     return HttpResponse('你输入的参数是pk:{}-id:{}'.format(pk, id))

      视图函数

              

         返回结果中输入的pk参数是5,但是默认的kwargs里是20,最终以额外参数里的为准。

    url命名


    path方法里面最后还有个name参数,默认为None,现在有以下场景:

    • 当访问莫一页面时,需要跳转到另一页面
      from django.shortcuts import render, HttpResponse, redirect
      
      # Create your views here.
      
      
      def index(request, pk, id):
          return HttpResponse('你输入的参数是pk:{}-id:{}'.format(pk, id))
      
      
      def show_info(request):
          return HttpResponse('<h1>hello world</h1>')
      
      
      def login(request):
          return redirect('/teacher/info')

      视图函数

      1 from django.urls import path
      2 from .views import *
      3 
      4 urlpatterns = [
      5     path('index/<pk>/', index, kwargs={'pk': 20,'id': 30,}),
      6     path('info/', show_info),
      7     path('login/', login),
      8 ]

      路由配置

    • 利用django的redirect方法实现页面的跳转,redirect里面传入一个路径的字符串。

             

    • 当访问login的时候,直接给跳转到了info页面。
    • 假设以后info页面的路径发生了改变,当有很多页面都跳向该页面的时候,人为的手动去修改redirect里面的路径会很麻烦。这时候就要用到django的path方法提供的name参数了。
       1 from django.shortcuts import render, HttpResponse, redirect, reverse
       2 
       3 # Create your views here.
       4 
       5 
       6 def index(request, pk, id):
       7     return HttpResponse('你输入的参数是pk:{}-id:{}'.format(pk, id))
       8 
       9 
      10 def show_info(request):
      11     return HttpResponse('<h1>hello world</h1>')
      12 
      13 
      14 def login(request):
      15     url = reverse('info')
      16     return redirect(url)
      1 from django.urls import path
      2 from .views import *
      3 
      4 urlpatterns = [
      5     path('index/<pk>/', index, kwargs={'pk': 20,'id': 30,}),
      6     path('info/', show_info, name='info'),
      7     path('login/', login),
      8 ]
    • 首先在需要跳转的页面的path方法里面,给该路由命名。加上name='info'。
    • 利用django提供的reverse方法,reverse方法接收一个字符串,该字符串为url的名字。该方法返回该名字的url的路径,再将这个路径重新赋予给redirect实现动态跳转。
    • 当不同的项目app里面拥有相同名称的url时,reverse函数就会发生冲突。django提供了一个app_name的变量来区分不同的app下拥有相同name的路由。
       1 from django.urls import path
       2 from .views import *
       3 
       4 app_name = 'crm'
       5 
       6 
       7 urlpatterns = [
       8     path('index/<pk>/', index, kwargs={'pk': 20,'id': 30,}),
       9     path('info/', show_info, name='info'),
      10     path('login/', login),
      11 ]
       1 from django.shortcuts import render, HttpResponse, redirect, reverse
       2 
       3 # Create your views here.
       4 
       5 
       6 def index(request, pk, id):
       7     return HttpResponse('你输入的参数是pk:{}-id:{}'.format(pk, id))
       8 
       9 
      10 def show_info(request):
      11     return HttpResponse('<h1>hello world</h1>')
      12 
      13 
      14 def login(request):
      15     url = reverse('crm:info')
      16     return redirect(url)
    • 在app目录下的路由模块(urls.py)中定一个一个app_name的变量,app_name一般为当前app的名字。
    • 在reverse函数里用写上'app名字:路由的名字'(app_name:route_name)来对拥有相同名字的url来进行区分。
      • reverse返回一个url路径字符串
      • reverse传参
        • reverse('app:name', kwargs={params:value})
  • 相关阅读:
    计算机网络 3.* 数据通信技术基础 .1
    计算机网络3.2&3.3(第二节介质&第三节多路复用)
    python mooc 3维可视化<第一周第二&三单元>
    python mooc 3维可视化<第一周第一单元>
    conda 下配置环境
    第二周<岭回归>
    第二周<线性回归>
    第二周<导学/分类>
    iOS UILabel详解
    开始iOS 7中自动布局教程(一)
  • 原文地址:https://www.cnblogs.com/ivy-blogs/p/10647643.html
Copyright © 2011-2022 走看看