今天我们学习如何配置 url, 如何传参, 如何命名, 以及渲染的方式, 内容大致有以下几个方面.
创建视图函数并访问
创建 App
django 中 url 规则
捕获参数
路径转换器
正则表达式
额外参数
渲染方式
创建视图并访问
项目中自带的 Python 文件中, 并没有带有视图, 因此我们自己创建一个, 通常, 我们把视图命名 views.py.
然后在 views.py 中, 导入头文件
from django.http import HttpResponse
然后我们在 views.py 中, 写一些 Python 函数, 用来访问
- def hello(request): /*request 用户的请求 */
- return HttpResponse('hello, 欢迎来到 django')
在 url.py 中为视图函数配置路由
- from django.urls import path
- from . import views
- urlpatterns = [
- path('hello',hello),
- ]
运行项目, 如果上传方式是 Ctrl+S 的话, 记得上传之后再运行, 成功后
浏览器输入 127.0.0.1:8000/hello 即可访问到
创建 App
创建 App 的方式不只一种, 在虚拟机里可以创建, 也可以在 pycharm 里创建
命令为: Python manage.py startapp appname
在虚拟机里创建完, 要在 pycharm 中下载下来
在 pycharm 中创建:
方式一:
项目运行成功后, 在 terminal 里面找到本项目, 输入命令 Python manage.py startapp appname
如果没有连接本地, 则需要重新连接
方式二:
tool ----> run manage.py projectname
startapp appname
此方法也需要下载下来
下载完成后, 创建的 App 就出现了.
url 规则
1, 网址组成
网址: 全球统一资源定位符
https://www.i.cnblogs.com/EditPosts.aspx?postid=10423125
这是本文网址, 做个栗子吧
https://www.i.cnblogs.com/EditPosts.aspx?postid=10423125
协议 域名 路径参数
django 只搜索路径部分, 与其他都无关
2,django 的路由系统
当一个请求来到
1, 首先到项目目录下, url.py 里查找路由规则
2, 跟 urlconf 模块, 里面定义了 urlpatterns 变量
3, 按顺序运行每一个, 到第一个匹配的模式停止
4, 一旦匹配, django 导入并调用给定的视图
5, 如果没有匹配到, 或者中间出错, 则返回 404
3,path 里参数的含义
path(route,view,kwargs=None,name=None)
route : (必须有) 是一个字符串的 url 规则
view : (必须有) 是个视图
kwargs :(可有可无) 额外参数, 是字典类型, 传递给 view
name :(可有可无)url 名字
4, 在 url 中捕获参数
尖括号 < 参数 > 可以捕获参数, 传递给视图
本来捕获的值是字符串
如果要捕获两个参数, 尖括号间可用 / 斜杠, 也可用 - 连接符, 但访问要一致
5, 路径转化器
如果想要让捕获的参数符合条件, 那么我们会用到路径转化器
符号是冒号 :eg:<int:age>
常用的路径转化器
int : 匹配任意整数
path : 匹配任意非空字符
str : 匹配除了 / 路径分隔符外所有字符串
uuid : 格式化 id
sulg : 匹配任意 ASCII 字符和连字符及下划线
6, 正则表达式
前面我们学习到路径转化器, 但是有时候我们的转化器并不能够完全满足我们捕获参数的条件, 像 int 转化器去捕获年份, 如果我们传入 10000, 肯定会捕获呀, 但不合理, 因此, 我们正则表达式可以更好用一些.
使用时, 首先要导入进来 form django.url import re_path
参数跟 path 里相同
下面看正则表达式的方法用什么捕获方式
第一种是分组的, 在视图中根据参数名传参
re_path(r'plan/(?P<year>\d\d\d\d)/(?P<month>[0-9]|1[0-2])/',plan),
年 四位数, 月 0-9 或者 1 和 0-2
第二种是不分组的, 在视图中安位置传参
re_path(r'plan/(\d{4})\([0-9]|1[0-2]/',plan),
\d\d\d\d 与 \ d{4} 含义相同, 都是四位整数
7. 主路由分配给分路由
如果所有是 url 都在主路由下配置, 那么对于检查和维护修改都会带来不便, 因此我们需要将主路由分配给各个 App 下的路由
方式: include()
使用方法: 先需要导入,
from django.urls import path,include
使用: eg, 名为 teacher 的 App, 将主路由分给 teacher.url
path('teacher/',include('teacher.urls')),
在 teacher-App 中, 创建 urls.py(因为新建的 App 没有自带 url.py)
在 teacher.url.py 中, 手动输入
- form django.urls import path
- from .views import *
这里的 views 是此 App 里的 views
include 可以多级使用
include 的原理: 当遇到 include 时, 路径就被切断, 然后在 include 包含的分路由中开始继续检索.
在 path('teacher-<age>/',include('teacher.urls')), 里面传参是可以的, 就是分路由每个都要传参.
8, 传递额外参数
当在路由中传入额外参数时, 如果 kwargs 中 key 值与捕获参数不一致, 按照 kwargs 为准.
如果在 include 后, 传递的话, 那么相当于此分路由各个 url 后都有此额外参数.
9,app_name 的作用
- 页面重定向
redirect 可以实现页面跳转
导入 from django.shortcuts import render,redirect,reverse
使用 return redirect('网址或者路径')
-reverse
如果给 path 里加入 name 参数, reverse(name) 就等于前面路径
因此实现页面跳转, 可以设变量 url=reverse(name 的值) 然后 return redirect(url) 即可实现
-app_name
那我们的 name 就不可以设为一样的吗?
在不同 App 下其实可以一样, 但需要使用 app_name
在 url.py 里 urlpatterns 前写
app_name = 'appname'
使用:
url=reverse(appname:name)
10, 模板系统
html 源码写到模板文件中
- 模板路径设置
在项目中创建 templates 文件夹, 在文件夹内创建跟 App 同名的文件夹
主目录下 settings.py 中找到 然后写入
- TEMPLATES = [
- {
- 'BACKEND': 'django.template.backends.django.DjangoTemplates',
- 'DIRS': [os.path.join(BASE_DIR, 'templates')],
- ...
- }
- 渲染
在 templates 下写的 HTML 要如何使用呢?
在需要使用的视图中引用
- from django.template.loader import get_template
- from django.shortcuts import render
使用时需要渲染, 用 render
def new(request):
fg=get_template('student/index.html') 路径从 templates 往下的开始写
- HTML=fg.render()
- return HttpResponse(HTML)
访问此视图, HTML 模板即可被渲染出来
另一种更简便的方法
- def new(request):
- return render(request,'student/index.html')
这次就到这里, 下一篇会深入模板变量哦.
来源: https://www.cnblogs.com/bdydrq/p/10423125.html