2012-02-24 67 views
0

我有两个型号:为什么这个django ModelForm无效?

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有效?

+0

你能尝试打印pdForm.errors – 2012-02-24 05:01:07

+0

** pdForm无效!

  • 资源
    • 此字段是必填项。
** – MrROY 2012-02-24 05:33:17

+0

啊,所以不知何故唯一的字段资源是空的。你可能需要检查'rd'来查看它是否为空。 – 2012-02-24 05:34:42

回答

1

你不应该在清理后的表单上分配空字段吗? 试着这么做:

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

我只是不知道这是否会与资源是在模型中唯一的领域工作。我是django noob,但它在很多形式中分配ForeignKey字段对我很有用。

+0

** pdForm.is_valid()**返回False,所以下面的代码将不会被执行。并且如果我在验证之前尝试pdForm.save(commit = False),错误将是**“ProcessData不能“** – MrROY 2012-02-24 06:14:27

+0

在pdForm.is_valid()之前尝试使用pdForm.fields ['resource'] = rd.id,然后执行.is_valid()和save()。我相信这是在清理数据之前更改表单域的方法。如果这没有帮助,我就没有想法。 – Marek 2012-02-24 14:34:19

+0

它是pdForm.fields ['resource'] = rd,而不是rd.id – Marek 2012-02-24 15:03:19

1

你为什么认为给表单对象分配一个随机属性会使它有效?表单使用其实例属性来检查其有效性毫无意义,文档中没有任何内容暗示它确实如此。

有几种方法可以正确解决这个问题。首先,也许最丑陋的是复制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()