基本上我有一个带有ManyToMany字段的模型,然后是一个从该模型派生的模型,其中该字段被呈现为“多选”选择框。在我的模板中我省略了该字段,而是选择在视图中为该字段准备值,然后将这些准备好的值传递给request.POST(实际上是request.POST的副本,因为request.POST是不可变的),然后请求.POST到表格然后继续正常。我无法弄清楚如何做到这一点,因为request.POST不仅仅是一个简单的python字典,而是一个QueryDict,它的行为略有不同。
我需要填充的字段称为"not_bases"
。当我使用表单创建窗口小部件时,它在内部工作得很好,但不是我喜欢用户界面。当我通过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:输入值列表。”。显而易见的是,来自查询列表的str()表示的列表外观在上面两种情况下并不相同,即使它们看起来完全相同
那我该怎么做?
答案 0 :(得分:2)
我真的不清楚你在这里要做什么,但我怀疑攻击QueryDict是实现它的正确方法。
如果您尝试自定义not_bases字段的显示,则可以简单地覆盖模型声明中的定义:
class MyModelForm(forms.ModelForm):
not_bases = forms.ChoiceField(choices=[(base, base) for base in bases])
class Meta:
model = MyModel
或者,如果您只是想避免在表单上显示它,可以将其从表单中排除,并在验证后设置值。
class MyModelForm(forms.ModelForm):
class Meta:
model = MyModel
exclude = ['not_bases']
....
if request.POST:
if form.is_valid():
instance = form.save(commit=False)
instance.not_bases = bases
instance.save()
这些中的任何一个都能满足您的需求吗?