2011-01-15 16 views
0

Ich versuche, Formularvorschau mit Google App Engine zu aktivieren. Folgende Fehlermeldung wird angezeigt: Ich vermute, dass Sie sich irrtümlich irgendwo befinden:GAE formpreview

... handler = handler_class() 
TypeError: __call__() takes at least 2 arguments (1 given) 

Können Sie sagen, was mit meinem Versuch nicht stimmt? Hier ist ein Teil des Codes.

UPDATE: Hier ist eine komplette App, wo die Vorschau nicht funktioniert. Alle Ideen sind willkommen:

import cgi 

from google.appengine.api import users 
from google.appengine.ext import db 
from google.appengine.ext import webapp 
from google.appengine.ext.webapp import template 
from google.appengine.ext.webapp.util import run_wsgi_app 

from google.appengine.ext.db import djangoforms 

class Item(db.Model): 
    name = db.StringProperty() 
    quantity = db.IntegerProperty(default=1) 
    target_price = db.FloatProperty() 
    priority = db.StringProperty(default='Medium',choices=[ 
     'High', 'Medium', 'Low']) 
    entry_time = db.DateTimeProperty(auto_now_add=True) 
    added_by = db.UserProperty() 

class ItemForm(djangoforms.ModelForm): 
    class Meta: 
     model = Item 
     exclude = ['added_by'] 

from django.contrib.formtools.preview import FormPreview 
class ItemFormPreview(FormPreview): 
    def done(self, request, cleaned_data): 
     # Do something with the cleaned_data, then redirect 
     # to a "success" page. 
     return HttpResponseRedirect('/') 

class MainPage(webapp.RequestHandler): 
    def get(self): 
     self.response.out.write('<html><body>' 
           '<form method="POST" ' 
           'action="/">' 
           '<table>') 
     # This generates our shopping list form and writes it in the response 
     self.response.out.write(ItemForm()) 
     self.response.out.write('</table>' 
           '<input type="submit">' 
           '</form></body></html>') 
    def post(self): 
     data = ItemForm(data=self.request.POST) 
     if data.is_valid(): 
      # Save the data, and redirect to the view page 
      entity = data.save(commit=False) 
      entity.added_by = users.get_current_user() 
      entity.put() 
      self.redirect('/items.html') 
     else: 
      # Reprint the form 
      self.response.out.write('<html><body>' 
            '<form method="POST" ' 
            'action="/">' 
            '<table>') 
      self.response.out.write(data) 
      self.response.out.write('</table>' 
            '<input type="submit">' 
            '</form></body></html>') 

class ItemPage(webapp.RequestHandler): 
    def get(self): 
     query = db.GqlQuery("SELECT * FROM Item ORDER BY name") 
     for item in query: 
      self.response.out.write('<a href="/edit?id=%d">Edit</a> - ' % 
            item.key().id()) 
      self.response.out.write("%s - Need to buy %d, cost $%0.2f each<br>" % 
            (item.name, item.quantity, item.target_price)) 

class EditPage(webapp.RequestHandler): 
    def get(self): 
     id = int(self.request.get('id')) 
     item = Item.get(db.Key.from_path('Item', id)) 
     self.response.out.write('<html><body>' 
           '<form method="POST" ' 
           'action="/edit">' 
           '<table>') 
     self.response.out.write(ItemForm(instance=item)) 
     self.response.out.write('</table>' 
           '<input type="hidden" name="_id" value="%s">' 
           '<input type="submit">' 
           '</form></body></html>' % id) 

    def post(self): 
     id = int(self.request.get('_id')) 
     item = Item.get(db.Key.from_path('Item', id)) 
     data = ItemForm(data=self.request.POST, instance=item) 
     if data.is_valid(): 
      # Save the data, and redirect to the view page 
      entity = data.save(commit=False) 
      entity.added_by = users.get_current_user() 
      entity.put() 
      self.redirect('/items.html') 
     else: 
      # Reprint the form 
      self.response.out.write('<html><body>' 
            '<form method="POST" ' 
            'action="/edit">' 
            '<table>') 
      self.response.out.write(data) 
      self.response.out.write('</table>' 
            '<input type="hidden" name="_id" value="%s">' 
            '<input type="submit">' 
            '</form></body></html>' % id) 

def main(): 
    application = webapp.WSGIApplication(
             [('/', MainPage), 
              ('/edit', EditPage), 
              ('/items.html', ItemPage), 
              ('/itemformpreview', ItemFormPreview(ItemForm)), 
              ], 
             debug=True) 

    run_wsgi_app(application) 

Der neue Versuch erzeugt eine Ausgabe über einen Formpreview Objekt

<table><django.contrib.formtools.preview.FormPreview object at 0x5316fd0></table> 

Einmal an einen Vorschauhandler bearbeitet

from django.contrib.formtools.preview import FormPreview 
class PreviewHandler(webapp.RequestHandler): 
    def get(self): 
     self.response.out.write('<html><body>' 
           '<form method="POST" ' 
           'action="/preview">' 
           '<table>') 
     self.response.out.write(FormPreview(AForm)) 
     self.response.out.write('</table>'          
           '<input type="submit">' 
           '</form></body></html>') 

Wenn GAE unterstützt die django Formstähle und formpreview dann wie kann ich es tun? Danke für deine Antworten.

Antwort

1

Sie versuchen, eine Instanz Ihrer 'AFormPreview' Klasse als Handler-Klasse für Ihre Webapp-App zu übergeben. Sie können dies nicht tun - die Handler-Klasse muss eine Unterklasse von webapp.RequestHandler sein.

+0

Danke für die Info! Die Django-Dokumentation sagt, dass die Form-Klasse als Argument übergeben werden sollte - ich denke, das unterscheidet GAE von Django und wird versuchen, die Implementierung entsprechend zu bearbeiten. –

+1

@ Niklas Sie verwenden Django nicht, obwohl Sie Webapp mit Django-Formularen verwenden. Dieser Teil der Dokumentation wird nur angewendet, wenn Sie den vollständigen Django-Stapel verwenden. –

+0

OK Ich versuche zu lernen, wo Webapp mit Django Formen und Django in diesem Fall unterscheiden. Um django.contrib.formtools.preview verwenden zu können, muss ich möglicherweise einen Patch mit Django erstellen oder meinen eigenen Vorschau-Handler schreiben. Danke für die Information. –