(二十七)从失败页面追到具体环节
表单 422 先看字段错误和本次绑定值;403 再区分 CSRF 来源、操作权限或书籍归属。用户可以登录但后台看不到书籍入口时,继续查 is_staff、组与模型权限;不能把登录成功当作全部授权。
页面有正确字段,数据库却提示缺列时,对照模型、迁移和当前实例文件。查不到刚才保存的书,也先核对是否换了用户、筛选条件、页码或 READING_INSTANCE。
渲染很慢时,先单独统计书籍查询段。循环中访问关联、模板中执行新的筛选、没有使用已预取结果,都能从 SQL 数量中看到。保留同一份输出比较,再判断优化是否正确。
# 续写同一文件:reading_project/src/library/views.py
def error_page(request, exception=None):
# 403 页面使用固定提示,不回显内部异常信息。
return render(
request, "error.html", {"message": "当前账号不能执行这个操作"}, status=403
)handler403 在总路由登记这个视图,为权限拒绝显示固定页面;用户输入继续按普通文字转义。Django 的调试页面与部署错误页面根据配置选择,排查记录中的状态要与正在使用的设置对应。
<!-- 项目文件:reading_project/src/library/templates/error.html -->
{% extends 'base.html' %}
{% block title %}操作未完成{% endblock %}
{% block content %}<section class="panel form-panel"><h1>操作未完成</h1><p role="alert">{{ message }}</p>
<a href="{% url 'library:index' %}">返回书架</a></section>{% endblock %}