如何在HTML模板中访问字典数据?解决'tuple' object has no attribute 'get'报错
解决Django条目页面的两个问题:字典数据访问与Markdown转换
错误根源
你碰到的'tuple' object has no attribute 'get'错误,核心原因是views.py中entry函数的返回值写法错误——你把render调用和上下文字典用逗号分隔,导致返回了一个元组,而Django需要的是标准HTTP响应对象。
问题1:在entry.html模板中访问字典数据
1. 修正views.py的返回逻辑
把错误的返回代码:
return render(request, 'encyclopedia/entry.html'), { 'entry': util.get_entry(name), 'name': name }
改成正确形式(将上下文字典作为render函数的第三个参数传入):
from . import util def entry(request, name): entry_content = util.get_entry(name) if entry_content is not None: # 提前获取内容,避免重复调用get_entry return render(request, 'encyclopedia/entry.html', { 'entry': entry_content, 'name': name }) else: return render(request, "encyclopedia/404.html")
2. 模板中直接访问数据
修正后,模板里的{{ name }}和{{ entry }}就能正常读取上下文字典中的数据,无需修改模板变量写法。
问题2:是否需要将Markdown转换为HTML?
需要。util.get_entry返回的是原始Markdown文本,直接在模板中显示会是纯文本格式,无法解析为富文本。处理步骤如下:
1. 安装Markdown转换库
pip install markdown
2. 在views.py中转换Markdown为HTML
修改entry函数,将获取到的Markdown文本转换为HTML:
from . import util import markdown def entry(request, name): entry_content = util.get_entry(name) if entry_content is not None: # 转换Markdown内容为HTML格式 entry_html = markdown.markdown(entry_content) return render(request, 'encyclopedia/entry.html', { 'entry': entry_html, 'name': name }) else: return render(request, "encyclopedia/404.html")
3. 模板中允许HTML渲染
Django默认会转义HTML内容,因此需要在模板中给entry变量添加safe过滤器,确保HTML能正常渲染:
{% extends "encyclopedia/layout.html" %} {% block title %} {{ name }} {% endblock %} {% block style %}{% endblock %} {% block body %} <div class="left">{{ entry|safe }}</div> <div class="right"> <a href="{% url 'edit' %}"> <button class="edit">Edit</button> </a> </div> {% endblock %}
内容的提问来源于stack exchange,提问作者tices
相关产品推荐
相关产品推荐

