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.
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. –
@ 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. –
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. –