django额外参数的传递和url命名

Posted ivy-blogs

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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来进行区分。

以上是关于django额外参数的传递和url命名的主要内容,如果未能解决你的问题,请参考以下文章

python 之 Django框架(路由系统include命名URL和URL反向解析命名空间模式)

如何将额外的 URL 值传递给 Django 通用 DeleteView?

Symfony2 将哈希片段参数附加到分页 URL

使用 Django 和 Jquery 将选择选项值传递给命名的 url 模式

如何在 django 2 中将 url 中的 # 作为参数传递

Django请求与响应