如何为request.POST构建自定义“list-type”条目

时间:2009-06-22 01:29:45

标签: python django

基本上我有一个带有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()表示的列表外观在上面两种情况下并不相同,即使它们看起来完全相同

那我该怎么做?

1 个答案:

答案 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()

这些中的任何一个都能满足您的需求吗?