如何在Django同一页面同时渲染函数视图数据与CreateView编辑器?
解决方案
直接修改你的EditEntryView类视图,通过重写get_context_data方法把prompt数据注入模板上下文,就能在同一页面同时展示prompt列表和文本编辑器。
1. 修改类视图代码
from django.views.generic.edit import CreateView from .models import Entry class EditEntryView(CreateView): model = Entry fields = ['body'] # 指定渲染文本编辑器的字段 template_name = 'your_template.html' # 替换成你实际的模板路径 def get_context_data(self, **kwargs): # 先获取父类CreateView生成的上下文(包含表单) context = super().get_context_data(**kwargs) # 把数据库中所有Entry的prompt数据加入上下文 # 如果需要过滤特定prompt,这里可以加筛选条件,比如Entry.objects.filter(...) context['prompt_list'] = Entry.objects.all() return context
2. 调整模板内容
在你的模板your_template.html中,先遍历渲染prompt列表,再放文本编辑器的表单:
<!-- 展示所有prompt内容 --> <div class="prompt-container"> {% for entry in prompt_list %} <div class="prompt-item"> {{ entry.prompt }} </div> {% empty %} <p>目前没有已存储的prompt</p> {% endfor %} </div> <!-- 文本编辑器(CreateView自动生成的表单) --> <div class="editor-container"> <form method="post"> {% csrf_token %} {{ form.body }} <!-- 只渲染body字段的编辑器,也可以用{{ form.as_p }}渲染整个表单 --> <button type="submit">保存内容</button> </form> </div>
说明
- 不需要保留原来的
indexx函数视图,所有逻辑整合到EditEntryView中即可 - 如果你原来的
indexx有特定的prompt筛选逻辑,直接把筛选代码移到get_context_data的Entry.objects.all()位置就行 - 之前直接把函数放进类视图没用,是因为类视图的上下文数据需要通过
get_context_data方法统一注入,这是Django类视图的标准用法
内容的提问来源于stack exchange,提问作者Trey Beast
相关产品推荐
相关产品推荐

