2012-02-24 94 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()