2012-02-13 23 views
2

私がどのように見えるのモデルがあります。その後、Django ModelFormは未指定のフィールドを空に設定しますか?

form = MyModelForm(instance=my_model, data={'bio': 'this is me'}) # where my_model has a name already set 

class MyModel(Model): 
    name = models.TextField(blank=True, default='') 
    bio = models.TextField(blank=True, default='') 

とのように見えるのModelForm:私はこのように私のフォームを初期化/作成すると

class MyModelForm(ModelForm): 

    class Meta: 
     model = MyModel 
     fields = ('name', 'bio') 

を:

form.is_valid() # evaluates to true 
form.save() # overwrites the name field in my_model and makes it blank! 

これは予想される動作ですか?フォーム内でフィールドが指定されていないのに空の文字列で上書きされていないことがインスタンス内にすでに存在することを保証できるように、これをどのように変更しますか?

答えて

8

注:すると、次のようなものを試してみてください。フィールドが必要な場合は、代わりに検証エラーが発生します。

最近、django-developersグループには、この動作の変更についてのdiscussionがありました。コア開発者のエイドリアンとポールは現在の行動を支持していた。

したがって、このビューのモデルフォームをblank = Trueを使用するモデルで使用する場合は、すべてのモデルフィールドをデータ辞書に含める必要があります。これには関数model_to_dictを使用できます。

from django.forms.models import model_to_dict 
data = model_to_dict(my_model) 
data.update({'bio': 'this is me'}) # or data.update(request.POST) 
form = MyModelForm(instance=my_model, data=data) 
+0

ありがとうございます!私が動的なモデルフォームを持っているときにデータが誤って上書きされるのを防ぐための素晴らしいアイデア –

+0

data.update(request.POST.dict()) –

+0

@Gromish私は簡単なテストをしました。より多くの人々がそれを見るので、ここにコメントを残すのではなく、新しい質問をする方がよいかもしれません。 – Alasdair

0

フォームに初期データを渡したい場合は、代わりにデータ

MyModelForm(instance=my_model, initial={'bio': 'this is me'}) 
          ^

の初期を使用し、[編集]

あなたは、フォームに名前を

fields = ('name', 'bio') 
をフィールドが含まれている場合

"name"のデータは一切渡しません。

フォームフィールドは、名前が空白として送信されたかのように動作します。お使いのモデルで許可され

、そうIS_VALID()ModelFormからinstance引数を提供

name = models.TextField(blank=True, default='') 
+0

私は* initial *データを渡そうとしていません。これはフォームを検証しようとしているデータです。 (私はJSON経由でそれを取得しています)。 –

1

Trueになりますと、彼らは同じ目的を果たす、すなわち、initialを渡すのと同じです。保存されるのは、常にdataです。その辞書内のフィールドが空の場合、モデルが保存されたときに表示されます。

単一のフィールドのみを扱う場合は、モデルの状態全体を維持する場合は、dataとします。あなたがblank=Trueを設定しているので、Djangoは唯一の空にnameフィールドを設定

data = my_model.__dict__ 
data['bio'] = request.POST.get('bio') 
MyModelForm(instance=my_model, data=data) 
関連する問題