ModelFormを介して作成されているエンティティにエンティティグループの関係を作成したいと思います。
parent=
親インスタンスを渡し、ModelFormで属性を設定するにはどうすればよいですか?
ModelFormを介して作成されているエンティティにエンティティグループの関係を作成したいと思います。
parent=
親インスタンスを渡し、ModelFormで属性を設定するにはどうすればよいですか?
この問題に対する適切な解決策が得られるかどうかを確認したいと思います。私自身の解決策は、エレガントとはほど遠いですが、これを行うことです。
book = models.Book(title='Foo')
chapter = models.Chapter(parent=book, title='dummy')
form = forms.ChapterForm(request.POST, request.FILES, instance=chapter)
基本的に、私は最初chapter
に正しい親関係を持つダミーオブジェクト(この場合)を作成し、次にそれをinstance
引数としてフォームのコンストラクターに渡します。フォームは、ダミーオブジェクトの作成に使用した使い捨てデータをリクエストで指定されたデータで上書きします。最後に、実際の子オブジェクトを取得するために、次のようにします。
if form.is_valid():
chapter = form.save()
# Now chapter.parent() == book
djangoforms.ModelFormをサブクラス化し、createメソッドを追加しました*:
class ModelForm(djangoforms.ModelForm):
"""Django ModelForm class which uses our implementation of BoundField.
"""
def create(self, commit=True, key_name=None, parent=None):
"""Save this form's cleaned data into a new model instance.
Args:
commit: optional bool, default True; if true, the model instance
is also saved to the datastore.
key_name: the key_name of the new model instance, default None
parent: the parent of the new model instance, default None
Returns:
The model instance created by this call.
Raises:
ValueError if the data couldn't be validated.
"""
if not self.is_bound:
raise ValueError('Cannot save an unbound form')
opts = self._meta
instance = self.instance
if self.instance:
raise ValueError('Cannot create a saved form')
if self.errors:
raise ValueError("The %s could not be created because the data didn't "
'validate.' % opts.model.kind())
cleaned_data = self._cleaned_data()
converted_data = {}
for name, prop in opts.model.properties().iteritems():
value = cleaned_data.get(name)
if value is not None:
converted_data[name] = prop.make_value_from_form(value)
try:
instance = opts.model(key_name=key_name, parent=parent, **converted_data)
self.instance = instance
except db.BadValueError, err:
raise ValueError('The %s could not be created (%s)' %
(opts.model.kind(), err))
if commit:
instance.put()
return instance
使い方は簡単です:
book = models.Book(title='Foo')
form = forms.ChapterForm(request.POST)
chapter = form.create(parent=book)
request.POSTでkey_nameを指定できるコードをコピーして貼り付けたのではなく、作成する引数として渡したことに注意してください。
*コードはの元のモデルフォームのsaveメソッドから変更されていますgoogle.appengine.ext.db.djangoforms
。