Django如何将多个FBV函数视图渲染到同一个模板中
解决方法
多个视图指向同一个模板是Django支持的常规操作,你遇到的无法渲染上下文的问题由三个错误导致,逐一修正即可:
1. 修正路由匹配冲突
你当前的两个路由路径完全相同,Django会优先匹配排在前面的file_view,所有请求永远不会走到file_category视图,需要给分类视图配置独立的路由:
urlpatterns = [ path('show/<file_id>', views.file_view, name="file"), # 分类视图用独立路径,不需要file_id参数 path('file-category/', views.file_category, name="file_category"), ]
2. 修正视图语法错误
file_category中的列表生成式存在语法错误,修正后代码如下:
def file_category(request): # 等价于生成0-36的整数列表 cat = list(range(37)) context = { 'cat': cat } return render(request, 'file.html', context)
3. 兼容模板的多上下文渲染
因为两个视图传递的上下文变量不同,直接在模板中调用不存在的变量会触发报错,需要在file.html中做变量存在性判断:
<!-- 单个文件相关渲染 --> {% if file %} <div>{{ file.name }}</div> {% endif %} <!-- 用户文件列表相关渲染 --> {% if files_p %} {% for item in files_p %} <div>{{ item.title }}</div> {% endfor %} {% endif %} <!-- 分类相关渲染 --> {% if cat %} {% for item in cat %} <div>分类{{ item }}</div> {% endfor %} {% endif %}
你也可以用Django模板的默认值过滤器简化处理,比如{{ cat|default:[] }},避免变量不存在时的异常。
内容的提问来源于stack exchange,提问作者Kome Gognome
相关产品推荐
相关产品推荐

