如何在Django HTML模板中调用函数变量实现MD文件跳转?
问题解决步骤
你当前的实现存在两个核心问题:
- views.py中直接执行
util.get_entry()却未传入参数,导致函数返回None,且模板无法给已执行的函数传参 - Django模板不支持直接调用带参数的Python函数,正确做法是通过URL路由+详情视图处理跳转请求
1. 编写详情视图(views.py)
创建专门处理条目详情的视图,接收title参数并调用get_entry获取内容:
from django.shortcuts import render import util def index(request): # 替换为你实际获取entries列表的逻辑(比如读取entries目录下的文件名) entries = ["apple", "banana", "cherry"] return render(request, "encyclopedia/index.html", { "entries": entries }) def entry_detail(request, title): content = util.get_entry(title) # 处理内容不存在的情况 if content is None: return render(request, "encyclopedia/404.html") return render(request, "encyclopedia/entry.html", { "title": title, "content": content })
2. 配置URL路由(urls.py)
添加详情页面的路由,让URL可以接收title参数:
from django.urls import path from . import views urlpatterns = [ path("", views.index, name="index"), # 新增路由,匹配带标题的详情页URL path("<str:title>/", views.entry_detail, name="entry_detail"), ]
3. 修改index.html模板
将列表项的链接改为指向详情路由,用Django的{% url %}标签生成正确URL:
{% block body %} <h1>All Pages</h1> <ul> {% for entry in entries %} <li><a href="{% url 'entry_detail' entry %}">{{ entry }}</a></li> {% endfor %} </ul> {% endblock %}
4. 创建详情页面模板(entry.html)
新建模板用于展示Markdown内容(如需将MD转为HTML,可参考后续补充):
{% block body %} <h1>{{ title }}</h1> <div>{{ content|safe }}</div> {% endblock %}
补充:将Markdown转为HTML显示
如果需要把MD内容渲染为HTML,先安装依赖pip install markdown,再修改entry_detail视图:
import markdown def entry_detail(request, title): content = util.get_entry(title) if content is None: return render(request, "encyclopedia/404.html") # 转换MD内容为HTML html_content = markdown.markdown(content) return render(request, "encyclopedia/entry.html", { "title": title, "content": html_content })
内容的提问来源于stack exchange,提问作者Matheus Coppi
相关产品推荐
相关产品推荐

