【发布时间】:2009-06-22 01:29:44
【问题描述】:
基本上,我有一个带有 ManyToMany 字段的模型,然后是从该模型派生的模型表单,其中该字段被呈现为“多选”选择框。在我的模板中,我省略了该字段,而是选择在视图中为该字段准备值,然后将这些准备好的值传递给 request.POST (实际上是 request.POST 的副本,因为 request.POST 是不可变的),然后将 request.POST 输入表单,然后照常进行。我不知道该怎么做,因为 request.POST 不仅仅是一个简单的 python 字典,而是一个 QueryDict,它的行为有点不同。
我需要填充的字段名为"not_bases"。当我使用表单创建小部件时,它在内部运行良好,但在 UI 方面并不符合我的喜好。当我通过 django 方便的调试错误窗口检查 django-form 提交的 POST 值时,工作中的 QueryDict 看起来像这样:
<QueryDict: {u'not_bases': [u'005', u'00AR', u'00F', u'00FD'], [...] }>
"not_bases" 的值似乎是一个列表,但它不仅仅是一个列表。我不能只是 .append() 到它,因为它不起作用。我翻遍了文档并找到了 .update(),它似乎 可以工作,但没有。这是我的代码:
newPOST = request.POST.copy()
for base in bases:
newPOST.update({"not_bases": base.identifier})
这是输出:
<QueryDict: {u'not_bases': [u'KMER', u'KYIP'], u'reference': [u''], [...] }>
但是当我将该 QueryDict 提供给表单时,我收到一个表单验证错误,上面写着“not_bases:输入值列表。”。很明显,来自 QueryDict 的 str() 表示的列表看起来在上述两种情况下并不相同,即使它们看起来完全相同
那么我该怎么做呢?
【问题讨论】:
-
如果我对源代码的理解是正确的,你应该可以 .append() 到 not_bases -list。你能澄清一下“它不起作用”是什么意思吗?
-
黑客 request.POST 是实现目标的错误方法。相反,修改您的表单,使其不需要该字段,而是在保存的模型中手动设置值(或您的表单对 POST 数据所做的任何其他操作)。