Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在Google App Engine的模型表单中设置父项_Python_Django_Google App Engine_App Engine Patch - Fatal编程技术网

Python 在Google App Engine的模型表单中设置父项

Python 在Google App Engine的模型表单中设置父项,python,django,google-app-engine,app-engine-patch,Python,Django,Google App Engine,App Engine Patch,我想在通过ModelForm创建的实体中创建实体组关系 如何传递父实例并在ModelForm中设置parent=属性?我很想知道您是否能找到解决此问题的好方法。我自己的解决方案远非优雅,就是这样做: book = models.Book(title='Foo') chapter = models.Chapter(parent=book, title='dummy') form = forms.ChapterForm(request.POST, request.FILES, instance=ch

我想在通过ModelForm创建的实体中创建实体组关系


如何传递父实例并在ModelForm中设置
parent=
属性?

我很想知道您是否能找到解决此问题的好方法。我自己的解决方案远非优雅,就是这样做:

book = models.Book(title='Foo')
chapter = models.Chapter(parent=book, title='dummy')
form = forms.ChapterForm(request.POST, request.FILES, instance=chapter)
基本上,我首先创建一个具有正确父关系的虚拟对象(
在本例中为chapter
),然后将其作为
实例
参数传递给表单的构造函数。表单将用请求中给出的数据覆盖我用来创建虚拟对象的一次性数据。最后,为了得到真正的子对象,我做了如下操作:

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_名称的代码,而是将其作为参数传递给create


*在google.appengine.ext.db.djangoforms

中,代码是从原始模型表单的save方法修改的,我确认它有效。我会等待一个更优雅的解决方案,如果没有任何结果,我会把你的答案标记为接受。谢谢,你已经获得了10分。不幸的是,这是目前最好的方法。