一、环境整理
本次在TodoApp的基础上进行演示。并且采用子路由的方式来实现。
1.1 在项目的urls.py中引入子路由
from django.contrib import admin
from django.urls import path, include
from MyAdmin.views import *
urlpatterns = [
path('admin/', admin.site.urls),
path('login/', login),
# 这里采用子路由,通过include引入应用的子路由
path('todo/', include('TodoApp.urls'))
]
1.2 在TodoApp下创建urls.py文件
from django.urls import path
from . import views
urlpatterns = [
# 子路由,配置路径
path('index/', views.index)
]
1.3 视图文件
from django.http import HttpResponse
from django.shortcuts import render
def index(request):
return HttpResponse("ok")
1.4 URL访问

1.5 路由路径如何解析
例如上图,访问到/todo/后,会被路由给处理,截取/todo/后,剩下的内容会传递给inlcude中的对应的子路由进行处理。此时就会到子路由和子视图的对应关系这里。
二、关于views的返回值类型
每个视图函数,必须返回一个HttpResponse类型的数据。
但是,有人说,返回模板的时候,可以不写HttpResponse呢?听我细细道来。
2.1 在模板文件夹下创建todo的模板

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>todo的首页</title>
</head>
<body>
{{ username }}
</body>
</html>
2.2 返回HttpResponse的模板的视图函数
from django.http import HttpResponse
from django.template import loader
def index(request):
template = loader.get_template("todo/index.html")
context = {
"username": 'todo列表',
}
return HttpResponse(template.render(context, request))

上面的写法,就是传统的正确的编写带有模板的视图的方式,是不是比较麻烦。
简单的来了。
2.2 render函数
「载入模板,填充上下文,再返回由它生成的 HttpResponse 对象」是一个非常常用的操作流程。于是 Django 提供了一个快捷函数,我们用它来重写 index() 视图:
from django.shortcuts import render
def index(request):
context = {
"username": 'todo列表2',
}
return render(request, 'todo/index.html', context)

三、视图出现404
3.1 子路由写法
from django.contrib import admin
from django.urls import path
from . import views
urlpatterns = [
path('index/', views.index),
# 这里使用的name给这个路径命名,后面会说到
path('detail/<int:id>', views.detail, name='detail'),
]
3.2 模板detail.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>详情</title>
</head>
<body>
{{ todo.todoName }}
</body>
</html>
3.3 视图函数写法
from django.http import Http404
from django.shortcuts import render
from .models import TodoModel
# 由于需要传递参数,这里第二个参数id就是路由中的id
def detail(request, id):
try:
todo = TodoModel.objects.get(pk=id)
except TodoModel.DoesNotExist:
raise Http404("传递的id不存在对应数据")
return render(request, "todo/detail.html", {"todo": todo})
3.4 正常访问

3.5 当访问一个不存在的时候

这个页面不太友好,后面会有处理这些不友好页面的时候。
3.6 get_object_or_404快捷方式
上面查询数据的时候,需要自己捕获异常,这里有一个不需要捕获异常的快捷方式。
当不存在的时候,就会抛出404
from django.http import Http404
from django.shortcuts import render, get_object_or_404
from .models import TodoModel
def detail(request, id):
todo = get_object_or_404(TodoModel, pk=id)
return render(request, "todo/detail.html", {"todo": todo})
这里这里的提示语,使用的是默认的,没有捕获异常的时候自己编写的提示语有意义。

四、去掉url中硬编码
4.1 为路由增加name
在模板中,使用url的时候,可能会有如下写法
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>详情</title>
</head>
<body>
{{ todo.todoName }}
<li><a href="/todo/detail/{{ todo.id }}/">点击 {{ todo.todoName }} 去看看</a></li>
</body>
</html>

上面的写法,todo路径是写死的了,如果后续修改了todo的url呢.
还记得在前面写视图的时候,使用name给detail视图增加了一个名字了吗?
这里就利用这个来解决硬编码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>详情</title>
</head>
<body>
{{ todo.todoName }}
{# 这里是 通过url 使用name是detail的url,然后传递的是todo.id的参数#}
<li><a href="{% url 'detail' todo.id %}">点击 {{ todo.todoName }} 去看看</a></li>
</body>
</html>
4.2 为路由增加命名空间
这个在前面的只是中 讲解过了,这里就不在赘述了。
五、如何自定义404视图
Django 中的默认报错视图应该能够满足大多数 Web 应用程序的需求,但如果您需要任何自定义行为,也可以轻松覆盖。 在 URLconf 中指定处理程序,在其他任何地方设置它们将不起作用。
5.1 一定要在settings.py中关闭Debug模式
Debug=false
5.2 在全局url.py中
from django.contrib import admin
from django.urls import path, include
from MyAdmin.views import *
handler404 = page_not_found_view
urlpatterns = [
path('admin/', admin.site.urls),
path('login/', login),
# 这里采用子路由,通过include引入应用的子路由
path('todo/', include('TodoApp.urls'))
]
5.3 404视图
def page_not_found_view(request, exception=None):
return render(request, '404.html')
5.4 404.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>404</title>
</head>
<body>
404哦
</body>
</html>
5.5 测试

六、HttpResponse子类
像404这样的,就是HttpResponseNotFound这个类,这个类就是HttpResponse的子类。
同理,可以按照该方式,处理500等其他的异常了。
原文始发于微信公众号(Python之家):Django-9-路由与视图
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/198131.html