You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CS50W项目1问题:搜索后跳转至404页面而非title.html

问题分析与修复方案

核心问题

你的search视图存在两个关键问题:

  1. 当搜索的条目不存在时,util.get_entry(entry_search)返回None,直接传入markdown2.markdown()会触发异常,导致视图无法返回合法响应,Django自动跳转至错误页面。
  2. 视图仅处理了存在条目的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 08:01:03