我有一个包含ManyToMany字段的表单。当我使用来自DB的数据加载表单时,它完美地呈现M2M字段。但是,如果我使用会话数据加载表单,则不会正确呈现M2M字段(即,未选中任何选项)。
场景:用户编辑其现有记录。在编辑时,他点击了一个将用户带到其他URL的按钮。半满的表格保存在会话中。当用户返回时,他可以继续编辑他的记录,而不是重新输入迄今为止所做的更改。还允许在会话中保存无效表单,因为它未设置保存。
会话数据使用以下方式创建:
request.session['form_inprogress'] = request.POST
表格使用会话数据和现有数据库记录加载预填充数据:
currentrecord = Books.objects.get(id=123)
booksform = BooksForm(request.session['form_inprogress'], instance=currentrecord)
由于某种原因,在渲染时不会检查类别M2M字段。但是,如果仅显示现有记录,则M2M字段呈现完美:
booksform = BooksForm(instance=currentrecord)
这是我的HTML模板:
<div class="form-group input_{{ form.categories.id_for_label }} multiplechoicefield">
{{ form.categories.errors }}
{{ form.categories.label }}
{{ form.categories }}
</div>
我非常感谢任何指针/建议。坚持这个问题好几天仍然不知道如何解决这个问题。 感谢。
答案 0 :(得分:0)
它现在正在工作但不确定它是否是最有效的解决方案。我所做的是在单独的会话数据中存储正在进行中的表单的ManyToMany字段(form.categories)值。我注意到在调试时,request.session ['form_inprogress']在将request.POST分配给它后显示了form.categories的列表值。但是当在下一个请求/视图中检查request.session ['form_inprogress']时,会话数据已丢失其列表值。我怀疑这是因为会话只将数据保存为dict。
所以这就是我所做的
将完成的一半表格(有效/无效)存入会话。
request.session ['form_inprogress'] = request.POST
request.session ['cat_inprogress'] = request.POST.getlist('categories')
表格使用会话数据和现有数据库记录加载预填充数据:
currentrecord = Books.objects.get(id = 123)
prefilled = request.session ['product_inprogress']
prefilled ['categories'] = request.session.get('cat_inprogress')
booksform = BooksForm(预填充,实例=当前记录)
希望这对其他人有用/帮助。