1

今日、私はのドキュメントを読み始めましたdjango.forms。APIは使いやすいようで、私はそれを試し始めました。それから実験を始めましdjango.forms.ModelFormたが、どこが間違っていたのかよくわかりません。

私の問題はここから始まります:を使用してを作成するときのsaveメソッドforminstance

私のモデルは

class Process(models.Model):
    key         = models.CharField(max_length=32, default="")
    name        = models.CharField(max_length=30)
    path        = models.CharField(max_length=215)
    author      = models.CharField(max_length=100)
    canparse    = models.NullBooleanField(default=False)
    last_exec   = models.DateTimeField(null = True)
    last_stop   = models.DateTimeField(null = True)
    last_change = models.DateTimeField(null = True, auto_now=True)

そして私の形は

class ProcessForm(ModelForm):
    class Meta:
        model  = Process
        fields = ('name', 'path', 'author')

モデルを保存するときに他のフィールドが自動的に設定されるため、フィールドとフィールドnameだけpathが必要でした。authorとにかく、私のテストデータベースにはすでにエントリがあり、フィールドがすべて設定されて有効なエントリを選択しました。

ドキュメントでは、次のように読むことができます。

# Create a form to edit an existing Article.
>>> a = Article.objects.get(pk=1)
>>> f = ArticleForm(instance=a)
>>> f.save()

非常によく、私は自分のコードで同じことをしたかった:

>>> from remusdb.models import Process
>>> from monitor.forms import ProcessForm
>>> 
>>> proc = Process.objects.get(name="christ")
>>> pf = ProcessForm(instance=proc)
>>> pf.save()
Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "/home/shaoran/devpython/lib/python2.6/site-packages/django/forms/models.py", line 364, in save
    fail_message, commit, construct=False)
  File "/home/shaoran/devpython/lib/python2.6/site-packages/django/forms/models.py", line 87, in save_instance
    save_m2m()
  File "/home/shaoran/devpython/lib/python2.6/site-packages/django/forms/models.py", line 78, in save_m2m
    cleaned_data = form.cleaned_data
AttributeError: 'ProcessForm' object has no attribute 'cleaned_data'
>>> pf.is_bound
False
>>> pf.is_valid()
False

proc有効なオブジェクトですが、Processフォームオブジェクトは私に同意していないようです。次の例としてやるなら

>>> post = { "name": "blabla", "path": "/somewhere", "author": "me" }
>>> pf = ProcessForm(post, instance=proc)
>>> pf.is_bound
True
>>> pf.is_valid()
True
>>> pf.cleaned_data
{'path': u'/somewhere', 'name': u'blabla', 'author': u'me'}

次に、ドキュメントの3番目の例のように機能します。

何かが足りないのですか、それともドキュメントにエラーがありますか?それとも私のModelコードは少し間違っていますか?

これはの内容ですproc

proc。dict {'name':u'christ'、'last_stop':datetime.datetime(2012、10、5、16、49、13、630040、tzinfo =)、'author':u'unkown'、'_state': 、'canparse':False、'last_exec':datetime.datetime(2012、10、5、16、49、8、545626、tzinfo =)、'key':u'aed72c9d46d2318b99ffba930a110610'、' path':u' / home /shaoran/projects/cascade/remusdb/test/samples/christ.cnf'、' last_change':datetime.datetime(2012、10、5、16、49、13、631764、tzinfo =)、' id':5}

4

1 に答える 1

1

フォームクラスの最初の引数は、フォームで検証する値を含むディクショナリです。

これらの値を渡すことは決してないため、フォームは入力を検証できません。それが何cleaned_dataもない理由です。フォームと.save()モデルの検証がトリガーされるため、フォームの検証は失敗します。

フォームには実際にはデータがないことに気付くでしょう。

af.data{}(空のdict) になりaf.is_boundますFalse(フォームをデータにバインドしていないため)

データがないため、検証は失敗します。エラーは少し誤解を招く可能性があります。空のdictを渡す場合:

af = ArticleForm({},instance=a)
af.save()

より適切なエラーが発生します。

ValueError: The Article could not be changed because the data didn't validate.

于 2012-10-05T17:22:13.460 に答える