Wagtail中如何在OneModelAdmin编辑模板引入TwoModelAdmin索引视图
实现方法
Wagtail ModelAdmin 的视图支持手动实例化渲染,直接把渲染完成的索引页HTML注入编辑页上下文即可,完整走原生权限、列表逻辑,不需要额外写重复的列表查询、分页代码。
步骤1:重写OneEditView的上下文方法,注入Two索引页内容
在你的OneEditView类中重写get_context_data,实例化TwoModelAdmin并渲染其索引视图,把生成的HTML传入模板上下文:
from .wagtail_admin import TwoModelAdmin # 替换成你自己TwoModelAdmin的实际导入路径 class OneEditView(MyEditView): # 你原有的OneEditView逻辑保留,新增下面的方法 def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) # 初始化TwoModelAdmin实例 two_admin = TwoModelAdmin() # 绑定索引视图对应的model_admin参数 two_index_view = two_admin.index_view_class.as_view(model_admin=two_admin) # 传入当前请求渲染索引视图,自动继承当前用户的权限校验 two_index_response = two_index_view(self.request) # 提取渲染完成的HTML字符串存入上下文 context["embedded_two_index"] = two_index_response.render().content.decode("utf-8") return context
步骤2:在编辑模板中嵌入渲染好的索引内容
打开你自定义的.../one-edit.html模板,在需要展示Two索引页的位置直接输出上下文变量,记得加safe过滤器避免Django转义HTML标签:
{# 你原有的编辑页模板内容保持不变 #} <div class="embedded-admin-index"> <h2>关联Two模型列表</h2> {{ embedded_two_index|safe }} </div> {# 其他原有模板内容 #}
可选:给嵌入的列表加默认过滤规则
如果需要嵌入的Two列表默认只展示和当前编辑的One实例关联的数据,可以构造独立的请求对象传入过滤参数,避免修改原请求影响编辑页本身的逻辑:
from django.http import HttpRequest, QueryDict # 在get_context_data方法内替换对应的视图调用逻辑 # 构造独立的GET参数 get_params = QueryDict(mutable=True) # 假设Two模型有个名为related_one的外键关联当前One模型,这里按实际字段名修改 get_params["related_one__id"] = self.instance.pk # 构造嵌入视图专用的请求对象,复制当前用户、session信息保证权限和会话正常 embed_request = HttpRequest() embed_request.method = "GET" embed_request.GET = get_params embed_request.user = self.request.user embed_request.session = self.request.session # 用构造的embed_request渲染视图 two_index_response = two_index_view(embed_request)
注意事项
- 这种嵌入方式会完整复用TwoModelAdmin的所有配置:包括列表字段、搜索、过滤、分页、自定义按钮、权限控制,和直接访问Two模型的后台菜单索引页效果完全一致
- 如果嵌入后出现样式间距问题,给外层
.embedded-admin-index容器加少量CSS调整即可,Wagtail后台的基础组件样式全局通用,不会出现功能异常 - 不要用iframe嵌入后台地址,会遇到CSRF、跨域、会话重复校验的问题,稳定性很差。
内容的提问来源于stack exchange,提问作者Hatim
相关产品推荐
相关产品推荐

