【问题标题】:Why this django ModelForm is not valid?为什么这个 django ModelForm 无效?
【发布时间】:2012-02-24 04:58:57
【问题描述】:

我有两个模型:

ProcessDao
  ** normal fields **
  resource = models.ForeignKey(ResourceData, related_name='processes')

ResourceData
  ** Normal Fields **

下面的代码在我的views.py中:

pdForm = ProcessDataForm(request.POST)
rd = ResourceData.objects.get(pick_date__exact = request.POST['pick_date'])
pdForm.resource = rd    <------ here is the assignment
if pdForm.is_valid():
  pdForm.save()
else:
  print 'pdForm is not valid ! ', pdForm.errors
  # print "resource is not valid."

有什么方法可以使 pdForm 有效吗?

【问题讨论】:

  • 你可以尝试打印 pdForm.errors
  • pdForm 无效!
    • resource
      • 此字段为必填项。
    跨度>
  • 啊,不知何故,唯一的字段资源是空的。您可能需要检查rd 以查看它是否为空。
  • rd 不是 null ,我已经检查过了。谢谢!
  • 如果我在 pdForm.is_valid() 之前尝试 pdForm.save(commit=False),错误将是 "The由于数据未经验证,无法创建 ProcessData。”

标签: python django django-models django-forms django-errors


【解决方案1】:

您不应该使用已清理的表单来分配空字段吗? 尝试类似:

if pdForm.is_valid():
    cleanform = pdForm.save(commit = False).
    cleanform.resource = rd
    cleanform.save()

我只是不确定它是否适用于资源作为模型中的唯一字段。我是 django noob,但它适用于我以多种形式分配 ForeignKey 字段。

【讨论】:

  • pdForm.is_valid() 返回 False,因此不会执行以下代码。如果我在验证之前尝试 pdForm.save(commit=False),则会出现错误将是“无法创建 ProcessData,因为数据没有经过验证。”
  • 在 pdForm.is_valid() 之前尝试 pdForm.fields['resource'] = rd.id,然后执行 .is_valid() 和 save()。我相信这是在清理数据之前更改表单字段的方法。如果这没有帮助,我就没有主意了。
  • 它是 pdForm.fields['resource'] = rd ,而不是 rd.id
【解决方案2】:

为什么您认为将随机属性分配给表单对象会使其有效?表单不会使用其实例属性来检查其有效性,并且文档中没有任何内容暗示它会这样做。

有几种方法可以正确解决此问题。首先,可能也是最丑陋的,是复制 request.POST 并将匹配对象的 id 插入其中。 (您需要复制它,因为原始实例是不可变的)。

更好的方法是从表单中完全排除该字段(通过表单的Meta 类)并在is_valid 子句中执行以下操作:

object = pdForm.save(commit=False)
rd = ResourceData.objects.get(pick_date__exact = pdForm.cleaned_data['pick_date'])
object.resource = rd  
object.save()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-27
    • 2012-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-26
    相关资源
    最近更新 更多