ModelForms для приложения модели ndb (у меня не работает djangoforms)

Я использую модель webapp2, ndb.
Я пытался использовать формы модели django с моделью ndb. Ниже приведены соответствующие части моей установки:

app.yaml:

libraries:
- name: webapp2
  version: "2.5.1"
- name: jinja2
  version: latest
- name: markupsafe                                                              
  version: latest
- name: django
  version: 1.3

Models.py:

class SubTask(ndb.Model):

    task = ndb.StructuredProperty(TaskList)
    description = ndb.TextProperty()
    start_time = ndb.DateTimeProperty()
    end_time = ndb.DateTimeProperty()

Forms.py:

from django.forms import ModelForm
from models import TaskList, TaskCategory, SubTask

class SubTaskForm(ModelForm):
    class Meta:
        model = SubTask

Обработчик:

class CreateSubTask(BaseHandler):
    def get(self):
        self.render_template('index.html', {'form':SubTaskForm})

app = webapp2.WSGIApplication([('/', IndexPage),
                               ('/subtask', CreateSubTask), ],
                              debug=True)

Ошибка, которую я получаю: AttributeError: объект типа «SubTask» не имеет атрибута «_meta»

Мой вопрос: есть ли способ использовать формы модели django с ndb, или если я ошибаюсь, что это? Если не django modelforms, модель ndb нормально работает с WTForms?

Ниже прилагается трассировка стека:

ERROR    2012-06-23 03:25:58,770 wsgi.py:189] 
Traceback (most recent call last):
  File "/homeproject/expts/google_appengine/google/appengine/runtime/wsgi.py", line 187, in Handle
    handler = _config_handle.add_wsgi_middleware(self._LoadHandler())
  File "/homeproject/expts/google_appengine/google/appengine/runtime/wsgi.py", line 225, in _LoadHandler
    handler = __import__(path[0])
  File "/homeproject/expts/google_appengine/google/appengine/tools/dev_appserver_import_hook.py", line 676, in Decorate
    return func(self, *args, **kwargs)
  File "/homeproject/expts/google_appengine/google/appengine/tools/dev_appserver_import_hook.py", line 1858, in load_module
    return self.FindAndLoadModule(submodule, fullname, search_path)
  File "/homeproject/expts/google_appengine/google/appengine/tools/dev_appserver_import_hook.py", line 676, in Decorate
    return func(self, *args, **kwargs)
  File "/homeproject/expts/google_appengine/google/appengine/tools/dev_appserver_import_hook.py", line 1722, in FindAndLoadModule
    description)
  File "/homeproject/expts/google_appengine/google/appengine/tools/dev_appserver_import_hook.py", line 676, in Decorate
    return func(self, *args, **kwargs)
  File "/homeproject/expts/google_appengine/google/appengine/tools/dev_appserver_import_hook.py", line 1665, in LoadModuleRestricted
    description)
  File "/homeproject/expts/google_appengine/tdl/main.py", line 18, in <module>
    from views import IndexPage, CreateSubTask
  File "/homeproject/expts/google_appengine/google/appengine/tools/dev_appserver_import_hook.py", line 676, in Decorate
    return func(self, *args, **kwargs)
  File "/homeproject/expts/google_appengine/google/appengine/tools/dev_appserver_import_hook.py", line 1858, in load_module
    return self.FindAndLoadModule(submodule, fullname, search_path)
  File "/homeproject/expts/google_appengine/google/appengine/tools/dev_appserver_import_hook.py", line 676, in Decorate
    return func(self, *args, **kwargs)
  File "/homeproject/expts/google_appengine/google/appengine/tools/dev_appserver_import_hook.py", line 1722, in FindAndLoadModule
    description)
  File "/homeproject/expts/google_appengine/google/appengine/tools/dev_appserver_import_hook.py", line 676, in Decorate
    return func(self, *args, **kwargs)
  File "/homeproject/expts/google_appengine/google/appengine/tools/dev_appserver_import_hook.py", line 1665, in LoadModuleRestricted
    description)
  File "/homeproject/expts/google_appengine/tdl/views.py", line 4, in <module>
    from forms import SubTaskForm
  File "/homeproject/expts/google_appengine/google/appengine/tools/dev_appserver_import_hook.py", line 676, in Decorate
    return func(self, *args, **kwargs)
  File "/homeproject/expts/google_appengine/google/appengine/tools/dev_appserver_import_hook.py", line 1858, in load_module
    return self.FindAndLoadModule(submodule, fullname, search_path)
  File "/homeproject/expts/google_appengine/google/appengine/tools/dev_appserver_import_hook.py", line 676, in Decorate
    return func(self, *args, **kwargs)
  File "/homeproject/expts/google_appengine/google/appengine/tools/dev_appserver_import_hook.py", line 1722, in FindAndLoadModule
    description)
  File "/homeproject/expts/google_appengine/google/appengine/tools/dev_appserver_import_hook.py", line 676, in Decorate
    return func(self, *args, **kwargs)
  File "/homeproject/expts/google_appengine/google/appengine/tools/dev_appserver_import_hook.py", line 1665, in LoadModuleRestricted
    description)
  File "/homeproject/expts/google_appengine/tdl/forms.py", line 4, in <module>
    class SubTaskForm(ModelForm):
  File "/homeproject/expts/google_appengine/lib/django_1_3/django/forms/models.py", line 205, in __new__
    opts.exclude, opts.widgets, formfield_callback)
  File "/homeproject/expts/google_appengine/lib/django_1_3/django/forms/models.py", line 145, in fields_for_model
    opts = model._meta
AttributeError: type object 'SubTask' has no attribute '_meta'

person user993563    schedule 23.06.2012    source источник
comment
согласно документации NDB, вы можете использовать NDB с инфраструктурой Django, добавляя промежуточное программное обеспечение к настройкам Django. Помните, что это должен быть первый класс промежуточного программного обеспечения в списке.   -  person dilip kumbham    schedule 23.06.2012
comment
я делаю приложение webapp2, просто хочу импортировать djangoforms. мне придется писать настройки и промежуточное ПО? есть ли более чистый процесс? не могли бы вы указать мне на эту документацию/учебник?   -  person user993563    schedule 23.06.2012
comment
developers.google.com/appengine/docs/python/ndb/overview# введение   -  person dilip kumbham    schedule 23.06.2012


Ответы (3)


Помимо приведенного выше комментария, если вы не указали настройки в файле main.py, djangoforms не будет отображаться. Кроме того, вам нужно добавить промежуточное ПО:

'google.appengine.ext.ndb.NdbDjangoMiddleware'

Выполнение двух вышеуказанных действий исправит ситуацию.

person apcelent    schedule 23.06.2012

Пожалуйста, не используйте djangoforms — он не поддерживается средой выполнения Python 2.7 App Engine.

person Guido van Rossum    schedule 23.06.2012
comment
Привет, Гвидо, есть ли какие-либо другие рекомендуемые типы форм вместо djangoforms, которые можно использовать со средой выполнения Python 2.7 App Engine? - person tony m; 17.03.2014
comment
Гвидо, какой рекомендуемый движок форм для моделей ndb в приложении python webapp2 в наши дни? - person Aerodyno; 20.11.2014
comment
Извините, я понятия не имею. Я больше не работаю и не использую Google App Engine или NDB. - person Guido van Rossum; 22.11.2014

Я никогда не использовал формы django, поэтому может не хватать какой-то магии (и это может не заставить его работать...), но эта строка выглядит неправильно:

self.render_template('index.html', {'form':SubTaskForm})

Вы передаете класс в свой шаблон, а не его экземпляр:

self.render_template('index.html', {'form':SubTaskForm()})
person Greg    schedule 23.06.2012