4

ModelFormを介して作成されているエンティティにエンティティグループの関係を作成したいと思います。

parent=親インスタンスを渡し、ModelFormで属性を設定するにはどうすればよいですか?

4

2 に答える 2

4

この問題に対する適切な解決策が得られるかどうかを確認したいと思います。私自身の解決策は、エレガントとはほど遠いですが、これを行うことです。

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
于 2010-01-19T21:49:51.837 に答える
0

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

于 2011-02-23T20:54:43.433 に答える