首页 > 其他分享 >Django路由

Django路由

时间:2024-03-31 19:29:21浏览次数:20  
标签:index App Django userlist user path 路由

Router介绍

在实际开发过程中,一个Django项目会包含很多的app,这时候如果我们只在主路由里进行配置就会显得杂乱无章,所以通常会在每个app里,创建各自的urls.py路由模块,然后从根路由出发,将app所属的url请求,全部转发到相应的us.py模块中。而这个从主路由转发到各个应用路由的过程叫做路由的分发

路由匹配

# 使用ur1给视图函数传参数
    path('index/',index)
    path('detail/<int:id>/',detail)
# 给ur1取别名,那么在使用此ur1的地方可以使用别名。比如:
    path('index/',index,name='index')
    path('detail/<int:id>/',detail,name='detail')

命名空间

在实际应用中,Django中可能存在多个应用程序,每个应用程序都可能有自己的路由模块。为了防止路由冲突,Django提供了命名空间(namespace)的概念。命名空间是一种将路由命名为层次结构的方式,使得在查询路由时可以限定在该命名空间内。

# 在根路由中可以设置命名空间
	path('app/',include(('App.urls',"App"),namespace='App'))

反向解析

Django路由反向解析是一个非常重要的功能,它可以让我们在代码中使用路由别名替代URL路径,在修改URL时避免代码中的硬编码依赖,同时也可以提高可读性和可维护性。
为什么叫反向解析呢? 正常的路由匹配,都是通过path路由规则一步一步找到.html文件。而反向解析因为有路由别名的原因,是直接从.html文件找到路由规则的

# 在视图函数中,反向解析ur1:
    from django.shortcuts import render,redirect,reverse
    def buy(request):
        return redirect(reverse('index'))
        return redirect(reverse('detail',args=[2]))
        return redirect(reverse('detail',kwargs={"id":2}))

#在templates中,使用别名:
    {%url 'detail' stu.id %}

# 使用命名空间:
# 指定命令空间后,使用反向解析时需要加上命名空间,比如:
#   1.在视图函数中:
        return redirect(reverse('App:index'))
# 2.在templates中:
        {% ur1 'App:index' %}

路由使用

创建名App的应用
App/models.py

from django.db import models

# Create your models here.
class UserModels(models.Model):
    name=models.CharField(max_length=30)
    age=models.PositiveIntegerField() # 非负数

App/urls.py

from django.urls import path
from App.views import *

urlpatterns=[
    # 首页
    path('index/',index)
]

urls.py

from django.contrib import admin
from django.urls import path,include
from App.views import *

urlpatterns = [
    # 1、直接使用根路由
    path('user/',index),

    # 2、使用子路由,使用include
    path('user/',include('App.urls')),

    # 3、使用子路由,使用include,命名空间namespace
    # 使用命名空间时注意,include函数有两个参数,默认第二个参数namespace为None
    # 当传命名空间的时候,第一个参数要是元组类型的,并且要加上App的名字,一般和应用的名字一样
    path('user/',include(('App.urls','App'),namespace='App')),
    path('admin/', admin.site.urls),
]

页面跳转

  • 当路由规则使用了命名空间,反向解析也只能使用带命名空间的方式
    创建userlist.html,使用index.html进行后端跳转
    index.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>首页</title>
</head>
<body>
    <h2>首页</h2>
    <hr>
    {#  1、URL路径  #}
    {#  当访问这个路径/user/userlist 相当于会访问后端的视图函数userlist(),来到urls.py文件对userlist的路由规则  #}
    <a href="/user/userlist">url路由的方式:进入用户列表页面</a>

    <hr>
    {#  2、反向解析  #}
    {#  userlist 是path路由的name值  #}
    <a href="{% url 'userlist' %}">反向解析的方式:进入用户列表页面</a>
    <hr>

    {#  反向解析:带命名空间  #}
    <a href="{% url 'App:userlist' %}">反向解析带命名空间的方式:进入用户列表页面</a>
</body>
</html>

views.py添加

# 用户列表
def usr_list(request):
    users=UserModels.objects.all()
    return render(request,'user_list.html',{'users':users})

1711462183069.png

路由传参

单个参数

创建userdetail.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>用户详情</title>
</head>
<body>
    <h2>用户详情</h2>
    <hr>
    用户姓名:{{ user.name }}
    <hr>
    用户年龄:{{ user.age }}
</body>
</html>

修改user_list.html

  • <a href="{% url 'userdetail' user.id %}">通过用户id拼接从而,当通过反向解析跳转到path匹配路径时,会将user.id 传入路由
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>用户列表</title>
</head>
<body>
    <h2>用户列表</h2>
    <hr>
    <ul>
        {% for user in users %}
            <li> 
                <a href="{% url 'userdetail' user.id %}">
                    {{ user.name }}-{{ user.age }}
                </a>
            </li>
        {% endfor %}

    </ul>
</body>
</html>

views.py添加

# 用户详情
def user_detail(request,uid):
    print('uid:',uid)
    # 通过主键获取一个对象的值
    user=UserModels.objects.get(pk=uid) # pk: primary key 主键
    return render(request,'userdetail.html',{'user':user})

usrls.py

from django.urls import path
from App.views import *

urlpatterns=[
    # 首页
    path('index/',index),
    # 用户列表
    path('userlist/',usr_list,name='userlist'),
    # 用户详情
    path('userdetail/<int:uid>/',user_detail,name='userdetail'),
]

1711462230195.png

多个参数

  • 要和路由中的参数名一致,名字对应赋值,理解为关键字传值
    views.py添加
# 多个参数
def user_ab_viem(request,a,b):
    return HttpResponse(f'a:{a}-b:{b}')
# 要和路由中的参数名一致,名字对应赋值
def user_ba_viem(request,b,a):
    return HttpResponse(f'a:{a}-b:{b}')

urls.py

from django.urls import path
from App.views import *

urlpatterns=[
    # 首页
    path('index/',index),
    path('userlist/',usr_list,name='userlist'),
    path('userdetail/<int:uid>/',user_detail,name='userdetail'),
    path('userab/<int:a>/<int:b>/',user_ab_viem,name='userab'),
    path('userba/<int:a>/<int:b>/',user_ab_viem,name='userba'),
]

1711461604942.png
1711461590780.png

重定向,反向解析

  • 当我们需要访问这个页面让他跳转到别的页面时就需要使用重定向了,而重定向一般会用到反向解析,上面提到了在模板html文件如何使用,现在是.py文件
  • 重定向函数redirect(),反向解析函数reverse(),就是通过路由别名反向得到路由
  • 如下,userlist为path(‘userlist/’,user_list,name=‘userlist’),路由规则别名
  • reverse(‘userlist’) => ‘/user/userlist/’
  • redirect(reverse(‘userlist’)) => redirect(‘/user/userlist/’)
# 重定向
def my_redirect(request):
    # 不带参数,没有使用reverse()函数反向解析
    # return redirect('https://www.baidu.com')
    # return redirect('/user/userlist/')
    # return redirect(reverse('userlist'))
    # return redirect('/user/userdetail/2/')

    # 反向解析
    # reverse('App:userdetail', args=(1,)) = 'userdetail/1/'
    # 带命名空间的写法
    # return redirect(reverse('App:userdetail',args=[3,])) # 位置参数传参,args类型可以是元组、数组
    # return redirect(reverse('App:userdetail',kwargs={'uid':2})) # 关键字传参,kwargs类型为字典

    # 不带命名空间
    return redirect(reverse('userdetail',args=(1,))) # 位置参数传参

拓展

# 如果用了命名空间,后面的反向解析(包括视图函数和模板中)都要使用命名空间  
path('user/',include(('App.urls','App'),namespace='App')),
  • 也可以两个都使用
# 2、使用子路由,使用include  
path('user/',include('App.urls')),  
  
# 3、使用子路由,使用include,命名空间namespace  
# 使用命名空间时注意,include函数有两个参数,默认第二个参数namespace为None  
# 当传命名空间的时候,第一个参数要是元组类型的,并且要加上App的名字,一般和应用的名字一样  
# 如果用了命名空间,后面的反向解析(包括视图函数和模板中)都要使用命名空间  
path('user/',include(('App.urls','App'),namespace='App')),
  • 这样就不会有,反向解析找不到函数的错误了
    image.png

标签:index,App,Django,userlist,user,path,路由
From: https://blog.csdn.net/2202_75361164/article/details/137061227

相关文章

  • Django学习_Day 1
    Day1学习笔记:学习视频:https://www.youtube.com/watch?v=yD0_1DPmfKM&list=PLQVvvaa0QuDe9nqlirjacLkBYdgc2inh37:30cmd命令'django-admin'管理命令来查看有什么命令可以运行'ThewayDjangoworksisassumesallwebsitesareactuallyjustacollectionofapps.'......
  • python(django)之单一接口管理功能后台开发
    1、创建数据模型在apitest/models.py下加入以下代码classApis(models.Model):Product=models.ForeignKey('product.Product',on_delete=models.CASCADE,null=True)#关联产品IDapiname=models.CharField('接口名称',max_length=100)apiurl=mod......
  • 静态路由原理与配置
    1.路由器的工作原理————工作在网络层的设备(1)路由概述:从源主机到目标主机的转发过程。路由器:能够将数据包转发到正确的目的地,并在转发过程中选择最佳路径的设备。(2)根据路由表转发数据包路由表:路由器中维护的路由条目的集合;路由器根据路由表做路径选择。2.路由表的形成(1)直......
  • django打包成exe格式
    #-*-mode:python;coding:utf-8-*-frompathlibimportPathimportPyInstaller.utils.hooksimportmonaifromPyInstaller.utils.hooksimportcollect_data_filesfromPyInstaller.building.apiimportPYZ,EXE,COLLECT#收集monai相关的文件monai_datas=[......
  • python+django在线政务便民服务系统flask
     随着时代在飞速进步,每个行业都在努力发展现在先进技术,通过这些先进的技术来提高自己的水平和优势,在线政务服务中心管理当然不能排除在外。在线政务服务中心管理系统是在实际应用和软件工程的开发原理之上,运用python语言以及vue框架进行开发。首先要进行需求分析,分析出在线政......
  • Django中values()和values_list()
    values()1、不带参数,返回所有属性的键值对,比如使用filter时,会返回一个列表,列表中每一项是一个字典>>>Blog.objects.values()[{'id':1,'name':'BeatlesBlog','tagline':'AllthelatestBeatlesnews.'}],>>>Blog.objects.filte......
  • Linux(4)常见操作整理-静态路由-双网卡-文件上传下载-运维思路-性能监测方法-jar包查找
    五、常见操作1、静态路由配置【描述】:当前ifconfigeno16777728对应ip:172.41.0.120【解决】:(1)[root@localhost~]#cd/etc/sysconfig/network-scripts/(2)添加文件:route-eno16777728​172.41.200.0/24via172.41.0.253deveno16777728​172.41.202.0/24via172......
  • 针对框架以外的页面路由配置教程
    一.找到项目中的routes.js//学生注册页面路由constAoYuStudentRegister=[{path:'/MarketAoYuStudentRegister',name:'学生信息填写',component:_import('system/AoYuStudentRegister')}]path:‘/MarketAoYuStudentRegister’:表示当用户访问/M......
  • router-link (3) pigx单体 路由跳转
    1.src/router下route.ts加入前端静态路由dynamicRoutes:这里是跳转后带菜单的 { path:'/pro/proProjectTaskAcceptance/index.vue', name:'项目验收', component:()=>import('/@/views/pro/proProjectTaskAcceptance/index.vue'), meta:{ i......
  • 使用Django和FastCGI管理长时间运行的过程
    问题背景:有一个Django+FastCGI的应用程序,需要修改以执行长时间的计算(可能长达半小时或更久)。需要在后台运行计算,并返回“您的作业已启动”类型的响应。在进程运行期间,进一步访问该URL应返回“您的作业仍在运行”,直到作业完成,此时应返回作业结果。以后任何对该URL的访问都......