Django-9-路由与视图

一、环境整理

本次在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访问

Django-9-路由与视图
image.png

1.5 路由路径如何解析

例如上图,访问到/todo/后,会被路由给处理,截取/todo/后,剩下的内容会传递给inlcude中的对应的子路由进行处理。此时就会到子路由和子视图的对应关系这里。

二、关于views的返回值类型

每个视图函数,必须返回一个HttpResponse类型的数据。
但是,有人说,返回模板的时候,可以不写HttpResponse呢?听我细细道来。

2.1 在模板文件夹下创建todo的模板

Django-9-路由与视图
image.png
<!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))
Django-9-路由与视图
image.png


上面的写法,就是传统的正确的编写带有模板的视图的方式,是不是比较麻烦。
简单的来了。


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)
Django-9-路由与视图
image.png

三、视图出现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 正常访问

Django-9-路由与视图
image.png

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

Django-9-路由与视图
image.png


这个页面不太友好,后面会有处理这些不友好页面的时候。


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})

这里这里的提示语,使用的是默认的,没有捕获异常的时候自己编写的提示语有意义。

Django-9-路由与视图
image.png

四、去掉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>
Django-9-路由与视图
image.png


上面的写法,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 测试

Django-9-路由与视图
image.png

六、HttpResponse子类

像404这样的,就是HttpResponseNotFound这个类,这个类就是HttpResponse的子类。
同理,可以按照该方式,处理500等其他的异常了。


原文始发于微信公众号(Python之家):Django-9-路由与视图

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/198131.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!