CS50W项目1问题:搜索后跳转至404页面而非title.html
问题分析与修复方案
核心问题
你的search视图存在两个关键问题:
- 当搜索的条目不存在时,
util.get_entry(entry_search)返回None,直接传入markdown2.markdown()会触发异常,导致视图无法返回合法响应,Django自动跳转至错误页面。 - 视图仅处理了存在条目的POST请求分支,未覆盖「条目不存在」的情况,也没有处理非POST请求的场景。
修复步骤
1. 修正视图逻辑,先判断条目是否存在
修改views.py的search视图,先检查条目是否存在,再进行markdown转换,同时补充分支处理:
def search(request): if request.method == "POST": entry_search = request.POST['q'] entry_content = util.get_entry(entry_search) # 先判断条目是否存在 if entry_content is not None: html_content = markdown2.markdown(entry_content) return render(request, "encyclopedia/title.html", { "content": html_content, "title": entry_search, }) else: # 条目不存在时,返回搜索结果页面(可后续扩展模糊搜索) return render(request, "encyclopedia/search_results.html", { "query": entry_search, "results": [] }) # 处理非POST请求(比如直接访问search路径) return redirect("index")
2. 实现模糊搜索(符合CS50W项目要求)
如果需要完成项目要求的「模糊匹配」功能,当精确匹配不到时返回包含关键词的条目列表,修改视图如下:
def search(request): if request.method == "POST": entry_search = request.POST['q'].strip() entry_content = util.get_entry(entry_search) if entry_content is not None: html_content = markdown2.markdown(entry_content) return render(request, "encyclopedia/title.html", { "content": html_content, "title": entry_search, }) else: # 模糊搜索:筛选所有包含关键词的条目 all_entries = util.list_entries() matching_entries = [entry for entry in all_entries if entry_search.lower() in entry.lower()] return render(request, "encyclopedia/search_results.html", { "query": entry_search, "results": matching_entries }) return redirect("index")
3. 创建搜索结果页面
新建encyclopedia/search_results.html文件,用于展示搜索结果:
{% extends "encyclopedia/layout.html" %} {% block title %} Search Results for "{{ query }}" {% endblock %} {% block body %} <h1>Search Results</h1> {% if results %} <ul> {% for entry in results %} <li><a href="{% url 'title' entry %}">{{ entry }}</a></li> {% endfor %} </ul> {% else %} <p>No entries found matching "{{ query }}".</p> {% endif %} {% endblock %}
额外注意事项
- 确认
util.get_entry()逻辑正确:当条目不存在时确实返回None。 - 表单的
method="POST"和csrf_token配置无误,无需修改。 - 路由中
search/的位置在title/之后是合理的,Django会按顺序匹配路由规则。
内容的提问来源于stack exchange,提问作者user20479187
相关产品推荐
相关产品推荐

