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

Django项目中用JavaScript加载HTML文件出现404找不到文件问题

解决Django模板前端加载404问题

问题根因

你直接通过JS请求templates/user_table.html会返回404,因为Django的模板目录不属于静态资源目录,框架不会直接对外暴露模板文件的访问路径,前端无法直接通过HTTP GET请求获取模板文件。

解决方法

1. 添加模板加载视图

在对应Django应用的views.py中新增视图,负责渲染并返回指定模板内容:

from django.http import HttpResponse
from django.shortcuts import render

def load_template(request, template_name):
    # 配置允许加载的模板白名单,避免非法访问
    allowed_templates = ['user_table.html']
    if template_name not in allowed_templates:
        return HttpResponse("访问受限", status=403)
    return render(request, template_name)

2. 配置路由映射

在项目(或应用)的urls.py中添加对应路由,让前端请求能匹配到上面的视图:

from django.urls import path
from .views import load_template  # 注意替换成你的视图所在路径

urlpatterns = [
    # 其他已有路由...
    path('load-template/<str:template_name>/', load_template, name='load-template'),
]

3. 修改JavaScript请求地址

把JS中请求模板的路径替换成刚配置的Django路由,不要直接访问templates目录:

function loadHtml(id, filename) {
    let xhttp;
    let element = document.getElementById(id);
    let file = filename;

    if (file) {
        xhttp = new XMLHttpRequest();
        xhttp.onreadystatechange = function() {
            if (this.readyState == 4) {
                if (this.status == 200) {
                    element.innerHTML = this.responseText;
                } else if (this.status == 404) {
                    element.innerHTML = "<h1>页面未找到</h1>";
                } else if (this.status == 403) {
                    element.innerHTML = "<h1>访问受限</h1>";
                }
            }
        };
        // 修改为Django路由地址
        xhttp.open("GET", `/load-template/${file}`, true);
        xhttp.send();
        return;
    }
}

4. 可选:用Django模板标签生成URL(更规范)

如果触发按钮是在Django模板中,可以用{% url %}标签自动生成正确的URL,避免硬编码路径错误:

<a href="#" onclick='loadHtml("template", "user_table.html")'>加载用户表格</a>
<!-- 更严谨的写法:直接传入完整路由 -->
<a href="#" onclick='loadHtml("template", "{% url "load-template" "user_table.html" %}")'>加载用户表格</a>

注意事项

  • 必须设置模板白名单,防止恶意用户请求敏感模板文件(如包含配置信息或用户隐私的模板)。
  • 如果目标模板包含Django模板语法(如{% extends %}、{{ variable }}),只有通过视图渲染后返回,这些语法才会被正确解析。直接请求模板文件会导致语法原样输出。

内容的提问来源于stack exchange,提问作者Galinski

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 01:13:28