2

我正在使用webapp2,ndb模型。
我試圖用ndb模型使用django模型窗體。以下是我的設置相關的部分:ndb模型appengine的模型框架(djangoforms不適合我)

的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'

我的問題:有沒有一種方法可以讓我用ndb使用django模型表單,或者如果我犯了錯誤是什麼? 如果不是django模型,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' 
+1

根據NDB文檔,您可以使用NDB和Django框架將中間件添加到Django設置中。記住它必須是列表中的第一個中間件類。 –

+0

我正在製作一個webapp2應用程序,只是想導入djangoforms。我將不得不編寫設置和中間件?有一個更清潔的過程嗎?你能指出我的文檔/教程嗎? – user993563

+0

https://developers.google.com/appengine/docs/python/ndb/overview#intro –

回答

2

除了上面的評論,如果你還沒有提供你的main.py文件中的設置,djangoforms將不會呈現。除此之外,您還需要添加一箇中間件:

'google.appengine.ext.ndb.NdbDjangoMiddleware' 

做上述兩項將解決問題。

0

我從來沒有使用Django表單所以可能會丟失一些魔術(和它可能無法使其工作...),但此行看起來錯誤:

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

你傳遞的類到您的模板,而不是它的一個實例:

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

請不要使用djangoforms - 它不受Python 2.7 App Engine運行時支持。

+2

嗨Guido,有沒有其他推薦的形式,而不是djangoforms,可用於Python 2.7 App Engine的運行時? –

+0

Guido,這些天,蟒蛇webapp2 appengine的ndb模型推薦的表單引擎是什麼? – Aerodyno

+0

對不起,我不知道。我不再使用Google App Engine或NDB。 –