2011-08-05 9 views
0

私はまだGoogleアプリケーションエンジンでdjangoフォームのプレビューを取得できませんでした。私は実際の例を見ていないと私はdjangoからgaeへのリクエストハンドラの使用法を翻訳できなかったので、Googleアプリケーションエンジンでdjangoフォームプレビューを使用しようとしましたが失敗しました。私は、フォームのプレビューを取得していますが、それは表示されません。GoogleアプリケーションエンジンでDjangoフォームプレビュー

 <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フレームワークからテンプレートを取得してそれを作成するか、独自のテンプレートを作成できますか?たとえば、そのユーザーを有効taの方法もFormPreviewのためのDjangoのドキュメントはhereを見つけることができます検証

<input type="button" value="&lt;-- Go back" name="back" onClick="history.back()" /> 

<input type="submit" name="validate" value='{% trans "Go" %}' /> 
+1

なぜテンプレートを使用していませんか? –

+0

私はセッションを持っていなかったし、プレビューのためにセッションオブジェクトが必要だと思う(私はビーカーセッションを使うことができる)と私は代わりにテンプレートを使うことができると思うが、私はすでに実装されているプレビューを使っていると考えている。今では私はビーカーセッション+テンプレートを使用してプレビューを実装するつもりですが、それは些細なものよりも大きいです - それはまたブロブを投稿しています –

+1

...テンプレートを使って何が起こっているのか分かりません。 –

答えて

1

を開始すべき変更を行うに戻るボタンを押します。これはFormPreviewがサブクラス化され、ハンドラとして使用されることを意図していることを明示しています.Webアプリケーションではできません。これはDjangoフレームワーク固有のものです。確かに、フォームでFormPreviewオブジェクトをインスタンス化するだけでは、文字列表現が有用であるとは思えません。

+0

ありがとう!私はそれができないのでそれを取る。 –

関連する問題