【问题标题】:How do I build a custom "list-type" entry to request.POST如何为 request.POST 构建自定义“列表类型”条目
【发布时间】: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 数据所做的任何其他操作)。

标签: python django


【解决方案1】:

真的不清楚你在这里要做什么,但我怀疑破解 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()

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

【讨论】:

  • 我的实际代码,我有“not_bases”以及大约 5 个其他“XXX_bases”字段。问题是 Base 对象只能存在于一个且只有一个字段中。为了做到这一点,我让表单不绘制那些“XX_fields”,而是使用单选按钮制作我自己的表单。我编写了一些代码,通过 POST 数据中的自定义字段,并为每个字段创建一个列表。我可以在 commit=False 之后添加它们,但是当我循环和制作列表时,为什么不直接将它添加到 request.POST 中呢?只需节省一步...
猜你喜欢
  • 1970-01-01
  • 2021-08-25
  • 1970-01-01
  • 2014-11-21
  • 2012-07-11
  • 2021-06-03
  • 1970-01-01
  • 2016-10-28
  • 1970-01-01
相关资源
最近更新 更多