什么是网站建设的三次点击原则,长尾关键词挖掘精灵官网,常见网站漏洞,网站群发软件文章目录 一、路由router路由匹配命名空间反向解析 二、实践创建用户模型Model添加子路由 - 创建用户首页页面跳转 - 使用反向解析和命名空间1. 不使用命名空间的效果2. 使用命名空间的效果 用户详情页面跳转 - 路由传参路由传递多个参数re_path 以前写法,了解即可重定向Redire… 文章目录 一、路由router路由匹配命名空间反向解析 二、实践创建用户模型Model添加子路由 - 创建用户首页页面跳转 - 使用反向解析和命名空间1. 不使用命名空间的效果2. 使用命名空间的效果 用户详情页面跳转 - 路由传参路由传递多个参数re_path 以前写法,了解即可重定向Redirect1. 重定向别的地址2.重定向到自己路由带参数3.重定向 反向解析: 位置参数传参4. 重定向 反向解析关键字传参 一、路由router
在实际开发过程中一个Djaqgo 项目会包含很多的 app这时候如果我们只在主路由里进行配置就会显得杂乱无章所以通常会在每个app 里创建各自的 urls.py 路由模块然后从根路由出发将 app 所属的 url 请求全部转发到相应的 urls.py模块中。而这个从主路由转发到各个应用路由的过程叫做路由的分发。
路由匹配
# 使用ur1给视图函数传参数
path(index/, index)
path(detail/int:id/, detail)# 给ur1取别名那么在使用此ur1的地方可以使用别名。比如:
path(index/, index, nameindex)
path(detail/int:id/, detail, namedetail)int:id 整数 str:id 字符串
命名空间
在实际应用中Diango中可能存在多个应用程序每个应用程序都可能有自己的路由模块。为了防止路由冲突Django提供了命名空间(namespace)的概念。命名空间是一种将路由命名为层次结构的方式使得在查询路由时可以限定在该命名空间内。
# 在根路由中可以设置命名空间path(app/, include((App.urls,App,namespaceApp)反向解析
Django路由反向解析是一个非常重要的功能它可以让我们在代码中使用路由别名替代URL路径在修改URL时避免代码中的硬编码依赖同时也可以提高可读性和可维护性。
redirect 叫重定向 我们在做跳转的时候其实就是做一个页面跳转在我们后台相当于是一个视图函数之间的跳转从这个视图函数直接跳到另一个视图函数 reverse 是反向解析 reverse(路由name) 得到的是name所对应的路由路径 (字符串)。reverse( ‘index’) ‘index/’redirect(reverse( ‘index’)) 相当于 redirect( ‘index/’ ) 也是可以跳转的。args 位置传参kwargs 关键字参数传参
# 在视图函数中反向解析ur1:from django.shortcuts import render,redirect,reversedef 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中:{% url App:index %}{% url App:detail 2 %}如果用了命名空间后面的反向解析(包括视图函数和模板中)都要使用命名空间 二、实践
新建一个新项目Day02MyDjangoPro01
创建用户模型Model App\models.py
from django.db import modelsclass UserModel(models.Model):name models.CharField(max_length30)age models.PositiveIntegerField() # 非负数
生成迁移文件: python manage.py makemigrations 执行迁移: python manage.py migrate
数据库添加几条数据
添加子路由 - 创建用户首页 App\urls.py
from django.urls import path
from App.views import *urlpatterns [path(index/, index), # 首页]App\templates\index.html
!DOCTYPE html
html langen
headmeta charsetUTF-8title首页/title
/head
bodyh2首页/h2hr/body
/htmlApp\views.py
from django.shortcuts import renderdef index(request):return render(request, index.html)根路由 Day02MyDjangoPro01\urls.py
from django.contrib import admin
from django.urls import path, include# from App.views import *urlpatterns [path(admin/, admin.site.urls),# 1. 直接使用根路由# path(user/, index),# 2.使用子路由: 使用include# path(user/, include(App.urls)),# 3.使用子路由: 使用include, 命名空间namespacepath(user/, include((App.urls, App), namespaceApp)),]http://127.0.0.1:8000/user/index/ 页面跳转 - 使用反向解析和命名空间 App\templates\user_list.html
!DOCTYPE html
html langen
headmeta charsetUTF-8title用户列表/title
/head
bodyh2用户列表/h2hr
/body
/htmlApp\views.py 创建视图函数user_list
from django.shortcuts import render# 首页
def index(request):return render(request, index.html)# 用户列表
def user_list(request):return render(request, user_list.html) App\urls.py 写一个路由
from django.urls import path
from App.views import *urlpatterns [path(index/, index), # 首页path(user_list/, user_list, nameuser_list) # 用户列表
]需求在index页面跳转到user_list页面
1. 不使用命名空间的效果
根路由 Day02MyDjangoPro01\urls.py App\templates\index.html
反向解析 {% url 定义路由后面name的名字 %}
!DOCTYPE html
html langen
headmeta charsetUTF-8title首页/title
/head
bodyh2首页/h2hr{# url路由跳转 #}a href/user/user_list/点击url路由的方式进入用户列表的页面/abr{# 反向解析 {% url 定义路由后面name的名字 %} #}{# user_list 是path路由的name值 #}a href{% url user_list %}反向解析的方式进入用户列表的页面/abr/body
/html点击是可以跳转的 2. 使用命名空间的效果
根路由 Day02MyDjangoPro01\urls.py App\templates\index.html
反向解析带命名空间 {% url 命名空间的名称:定义路由后面name的名字 %}。namespace你可以理解为 一个子路由有一个命名空间。
这样做有什么用一个命名空间表示一个应用我们在写代码的时候如果我们在不同应用中取相同name的话那么可以通过应用空间namespace去区分他们。
如果是用子路由就建议使用命名空间
!DOCTYPE html
html langen
headmeta charsetUTF-8title首页/title
/head
bodyh2首页/h2hr{# url路由跳转 #}a href/user/user_list/点击url路由的方式进入用户列表的页面/abr{# 反向解析 {% url 定义路由后面name的名字 %} #}{# user_list 是path路由的name值 #}
{# a href{% url user_list %}反向解析的方式进入用户列表的页面/a#}br{# 反向解析带命名空间 {% url 命名空间的名称:定义路由后面name的名字 %} #}a href{% url App:user_list %}反向解析带命名空间的方式进入用户列表的页面/a
/body
/html点击是可以跳转的 用户详情页面跳转 - 路由传参 App\views.py user_list 传参、用户详情
from django.shortcuts import render
from App.models import *# 首页
def index(request):return render(request, index.html)# 用户列表
def user_list(request):# 获取所有用户数据users UserModel.objects.all()return render(request, user_list.html, {users: users})# 用户详情
def user_detail(request, uid):# print(uid:, uid)user UserModel.objects.get(pkuid) # pk:primary key主键return render(request, user_detail.html, {user: user})
增加一个页面用户详情页面 App\templates\user_detail.html
!DOCTYPE html
html langen
headmeta charsetUTF-8title用户详情/title
/head
bodyh2用户详情/h2hrp用户的名字:{{ user.name }}/pp用户年龄:{{ user.age }}/p
/body
/html添加路由 App\urls.py
from django.urls import path
from App.views import *urlpatterns [path(index/, index), # 首页path(user_list/, user_list, nameuser_list), # 用户列表path(userdetail/int:uid/, user_detail, nameuserdetail), # 用户详情
] App\templates\user_list.html 将数据显示
!DOCTYPE html
html langen
headmeta charsetUTF-8title用户列表/title
/head
bodyh2用户列表/h2hrul{% for user in users %}li{# 反向解析: 路由传参 #}a href{% url App:userdetail user.id %}{{ user.name }} - {{ user.age }}/a/li{% endfor %}/ul/body
/html路由传递多个参数 App\views.py
from django.http import HttpResponse# 多个参数
def user_ab_view(request, a, b):return HttpResponse(fa:{a} - b:{b})添加路由 App\urls.py
# 多个参数
path(userab/int:a/int:b/, user_ab_view, nameuser_ab),但是如果我把视图函数参数顺序反过来 会怎么样呢? 可以看到跟视图函数a,b顺序是没有关系的a传给ab传给b。
我们在用的时候要和路由中的参数名一致名字对应赋值你可以理解为相当于关键字参数传值a赋给ab赋给b。
re_path 以前写法,了解即可
re 是正则的意思 第一个参数 得用正则一般前面加一个r字符串转义这个跟正则没有太大关系一般会写上r。有几个参数写上几个括号() 整个字符串user_ba/()/()/会当做字符去处理的
\d表示一个数字\d表示它可以是数字表示这一块接收的是整数的意思就是一个整数多个整数都可以但不能为零个整数。 a表示整数的名字?Pa这一串其实是给它命一个名字给这个分组命名为a。
重定向Redirect
1. 重定向别的地址 App\views.py
from django.shortcuts import render, redirect, reverse# 重定向
def my_redirect(request):return redirect(https://blog.csdn.net/weixin_59633478/category_12401835.html)添加路由 App\urls.py
path(myredirect/, my_redirect)打开浏览器输入http://127.0.0.1:8000/user/myredirect 注意自动跳到了https://blog.csdn.net/weixin_59633478/category_12401835.html地址改变了
2.重定向到自己路由带参数 App\views.py
def my_redirect(request):# return redirect(/user/user_list)return redirect(/user/userdetail/2/) # 带参数第一种写法3.重定向 反向解析: 位置参数传参
def my_redirect(request):# return redirect(/user/userdetail/2/) # 带参数第一种写法# 反向解析return redirect(reverse(App:userdetail, args(2,))) # reverse(App:userdetail, args(2,)) 相当于 /user/userdetail/2/注意: 有命名空间一定要写命名空间如果没有命名空间就不用写命名空间
# 不带命名空间
return redirect(reverse(userdetail, args(2,))) 4. 重定向 反向解析关键字传参
def my_redirect(request):# 反向解析# return redirect(reverse(App:userdetail, args(2,))) # 反向解析: 关键字传参return redirect(reverse(App:userdetail, kwargs{uid: 2}))