2010-10-06 84 views
10

好吧,我一直盯着這幾個小時試圖弄清楚發生了什麼,無濟於事。 我想創建一個ModelForm使用'實例'關鍵字來傳遞一個現有的模型實例,然後保存它。 這裏是的ModelForm(在我試圖找出這個問題的原因,從原來的顯着剝離):Django ModelForm無法驗證,沒有錯誤

class TempRuleFieldForm(ModelForm): 
    class Meta: 
     model = RuleField 

,這裏是我運行代碼:

>>> m = RuleField.objects.get(pk=1) 
>>> f = TempRuleFieldForm(instance=m) 
>>> f.is_valid() 
False 

的模型對象(上面的m)是有效的,它保存得很好,但表單不會生效。現在,據我所知,此代碼與此處找到的Django文檔示例相同:http://docs.djangoproject.com/en/dev/topics/forms/modelforms/#the-save-method,但顯然我錯過了某些內容。我非常感謝一些新的眼睛告訴我我錯了什麼。

感謝

+2

'f.errors'打印出來什麼? – sdolan 2010-10-06 05:53:50

回答

21

請注意,您的鏈接不調用f.is_valid(),它只是直接節省。這可能有點誤導。

的要點是,實例化形式只是一個instance參數,但沒有data確實綁定到數據,因此,形式是無效的。你會看到f.is_bound是False。

在幕後,instance實際上與傳遞initial數據的效果相同,因爲這些文檔說明僅用於最初顯示數據並且不用於保存。您可能會從閱讀notes on bound and unbound forms中受益。

+3

+1。 「實例並不意味着綁定」:這是正確的推理。 – 2010-10-06 09:25:09

+0

謝謝,這很有道理。我知道這將是簡單的... – oogles 2010-10-07 22:08:32

+0

只是澄清,我使用f.is_valid()的原因只是爲了使問題更加簡潔。使用f.save()會失敗,並在clean_data字段上出現AttributeError,直到表單生效爲止,該字段才存在。因此,即使當我使用代碼_exactly_(因爲它是在我發佈的鏈接中使用f.save()而不是f.is_valid())時,它仍然失敗。 – oogles 2010-10-07 22:11:37

3

如果你還想驗證數據庫中的對象,可以先序列化它,然後用它創建Form。

from django.utils import simplejson 
from django.core.serializers import serialize 

(...) 

fields_dict = simplejson.loads(serialize('json', [obj]))[0]['fields'] 
form = forms.MyForm(fields_dict) 
if form.is_valid 

這可能不是最好的方式來做到這一點,但我發現從模型中獲得綁定形式的唯一方法。我需要它,因爲我想驗證數據庫中的當前數據。我創建了一個問題,因爲我不認爲這是做的最好的方式,這不是OP解決

Transform an unbound form to a bound one?

+2

我錯過了整個「將數據綁定到表單」的東西,這就是你在序列化。我相信Django的django.forms.models.model_to_dict會比序列化更好 - 請參閱我的回答你的問題:[link](http://stackoverflow.com/questions/8993749/transform-an-unbound-form-to -a綁定,一個#8996585)。 – oogles 2012-01-25 01:11:23

0

,但它是文章標題,這是相當高的谷歌。所以,無論如何,我會發布它,從here

如果你已經給request.POST使用request.POST or None您的形式,但它仍然是無效的沒有錯誤,請檢查沒有任何重定向回事。重定向會丟失您的POST數據,並且您的表單將無效,因爲它沒有綁定。