【发布时间】:2011-10-20 13:44:01
【问题描述】:
我仍然没有让 django 表单预览与谷歌应用引擎工作。我没有看到一个可行的示例,并且我尝试将 django 表单预览与谷歌应用引擎一起使用失败了,因为我无法将请求处理程序的用法从 django 转换为 gae。我正在获取表单预览,但它不会呈现:
<html><body><form method="POST" action="/preview">
<table>
<django.contrib.formtools.preview.FormPreview object at 0x3c5ca50>
</table><input type="submit"></form></body></html>
上面生成HTML的代码是:
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 PreviewHandler(webapp.RequestHandler):
def get(self):
self.response.out.write('<html><body>'
'<form method="POST" '
'action="/preview">'
'<table>')
self.response.out.write(FormPreview(ItemForm()))
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(
[('/', PreviewHandler),
('/edit', EditPage),
('/items.html', ItemPage),
],
debug=True)
run_wsgi_app(application)
我应该如何实现 PreviewHandler? 提前谢谢你
更新:由于 django 有表单预览,我可以从 django 框架中获取模板并在其上构建或制作自己的模板吗?例如,如何让用户按下后退按钮进行更改,也应该启动验证
<input type="button" value="<-- Go back" name="back" onClick="history.back()" />
<input type="submit" name="validate" value='{% trans "Go" %}' />
【问题讨论】:
-
你为什么不用模板?
-
我没有会话,对于预览,我认为它需要一个会话对象(我可以使用烧杯会话)并且我可以使用模板,但我想要我认为的最高级别的解决方案正在使用已经实现的预览。现在看起来,我将使用烧杯会话 + 模板来实现预览,以实现比普通表单更大的表单 - 它也在发布 blob
-
...我看不出这与使用模板有什么关系。
-
感谢尼克的评论。我创建了一个模板 preview.html 但我不完全了解如何使用它,因为我想要一些我没有提到的额外内容,例如处理密码和超时添加的未发布且仅由用户在第一次之后留下的实体提交。所以我想我应该添加另一个变量来指示该项目是否已发布,并且当已经实现了表单预览的用例时,它似乎违反了 DRY 原则。我要处理的主要附加内容是项目的 blob 和密码。
标签: python google-app-engine django-forms