使用会话数据加载表单时,ManyToMany表单字段无法呈现

时间:2015-07-09 12:08:05

标签: django-forms django-templates

我有一个包含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>

我非常感谢任何指针/建议。坚持这个问题好几天仍然不知道如何解决这个问题。 感谢。

1 个答案:

答案 0 :(得分:0)

它现在正在工作但不确定它是否是最有效的解决方案。我所做的是在单独的会话数据中存储正在进行中的表单的ManyToMany字段(form.categories)值。我注意到在调试时,request.session ['form_inprogress']在将request.POST分配给它后显示了form.categories的列表值。但是当在下一个请求/视图中检查request.session ['form_inprogress']时,会话数据已丢失其列表值。我怀疑这是因为会话只将数据保存为dict。

所以这就是我所做的

  1. 将完成的一半表格(有效/无效)存入会话。

    request.session ['form_inprogress'] = request.POST

    request.session ['cat_inprogress'] = request.POST.getlist('categories')

  2. 表格使用会话数据和现有数据库记录加载预填充数据:

    currentrecord = Books.objects.get(id = 123)

    prefilled = request.session ['product_inprogress']

    prefilled ['categories'] = request.session.get('cat_inprogress')

    booksform = BooksForm(预填充,实例=当前记录)

  3. 希望这对其他人有用/帮助。