11

わかりました、私は何が起こっているのかを理解しようとして何時間もこれを見つめていましたが、無駄になりました。'instance'キーワードを使用してModelFormを作成し、既存のモデルインスタンスを渡して、保存しようとしています。これが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、明らかに何かが足りません。私が間違っていることを教えてくれる新鮮な目で大いに感謝します。

ありがとう

4

4 に答える 4

22

リンクは呼び出さずf.is_valid()、直接保存するだけであることに注意してください。これは、少し誤解を招く可能性があります。

instance重要なのは、パラメータだけでフォームをインスタンス化するが、それをデータにバインドしないため、フォームが無効になるということdataですあなたはそれが誤りであることがわかるでしょうf.is_bound

舞台裏でinstanceは、実際にはデータの受け渡しとまったく同じです。initialドキュメントノートは最初にデータを表示するためにのみ使用され、保存には使用されません。バインドされたフォームとバインドされていないフォームのメモを読むと、おそらくメリットがあります。

于 2010-10-06T08:36:01.447 に答える
3

それでもデータベースにあったオブジェクトを検証したい場合は、最初にそれをシリアル化してから、それを使用してフォームを作成できます。

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

これはおそらくそれを行うための最良の方法ではありませんが、モデルからバインドされたフォームを取得するために私が見つけた唯一の方法です。データベース内の現在のデータを検証したいので、これが必要です。これが最善の方法ではないと思うので、質問を作成します。

バインドされていないフォームをバインドされたフォームに変換しますか?

于 2012-01-24T20:38:07.700 に答える
0

これはOPの解決策ではありませんが、Googleで非常に高い投稿タイトルの解決策です。とにかく、ここから投稿します:

を使用してフォームにrequest.POSTを既に指定しているrequest.POST or Noneが、エラーが発生しない限り無効である場合は、リダイレクトが行われていないことを確認してください。リダイレクトはPOSTデータを失い、フォームはバインドされていないため、エラーなしで無効になります。

于 2016-01-07T09:40:46.937 に答える
0

OPの解決策はそれほど多くありませんが、これは私が遭遇した問題でした。特にModelFormsで単体テストを実行する場合、フォームをバインドし続けてから、まったく同じデータでインスタンスを定義するのは面倒でした。他の人が役立つと思われることを簡単にするために、小さなヘルパー関数を作成しました。これはテスト目的でのみ使用しており、大幅な調整を行わずに他の場所にデプロイする場合は注意が必要です。

def testing_model_form(instance, model_form_class):
"""
A function that creates instances ModelForms useful for testing, basically takes an instance as an argument and will take care
of automatic binding of the form so it can be validated and errors checked
"""
fields = model_form_class.Meta.fields

data_dict = {}
for field in fields:
    if hasattr(instance, field):
        # The field is present on the model instance
        data_dict[field] = getattr(instance, field)
x = model_form_class(data=data_dict)
x.instance = instance
return x
于 2020-03-03T18:38:54.360 に答える