0

モデルを編集または更新する方法を理解しようとしています。エラーメッセージが表示されるシナリオをいくつか試しました: 405 Method Not Allowed - メソッド POST は、このリソースに対して許可されていません。以下は私のコードです:

Python モデル:

import os 
import webapp2
import wsgiref.handlers
from google.appengine.ext import db
from google.appengine.ext.webapp import template

class MessageModel(db.Model):
    content = db.StringProperty(multiline=True)
    date = db.DateTimeProperty(auto_now_add=True)

class Message(webapp2.RequestHandler):

    def get(self):
        doRender(self,'message.htm')

    def post(self):
        m = MessageModel()
        m.content = self.request.get('content')
        m.put()

        self.redirect('/view') 

class View(webapp2.RequestHandler):

    def get(self):

        que = db.Query(MessageModel)
        messageview_list = que.fetch(999)

        doRender(self,
                 'view.htm', 
                 {'messageview_list': messageview_list })


class Edit(webapp2.RequestHandler):

    def get(self):

        doRender(self,'edit.htm')    

    def post(self):

        updated_content = self.request.get('content')

        content_query = db.GqlQuery("SELECT * "
                                   "FROM MessageModel "
                                   "ORDER BY date DESC LIMIT 1")

        messageview_list = content_query.fetch(1)
        m = MessageModel()
        m.content = self.request.get(updated_content)
        m.put()

        doRender(self,
                 'edit.htm', 
                 {'messageview_list': messageview_list })


class Main(webapp2.RequestHandler):

    def get(self):
        doRender(self,'index.htm')


def doRender(handler, tname = 'index.htm', values = { }):
    temp = os.path.join(
    os.path.dirname(__file__),
    'templates/' + tname)
    if not os.path.isfile(temp):
    return False

    newval = dict(values)
    newval['path'] = handler.request.path

    outstr = template.render(temp, newval)
    handler.response.out.write(outstr)
    return True




app = webapp2.WSGIApplication([('/', Main),
                   ('/message', Message),
                   ('/view', View),                                                                          
                   ('/edit', Edit)], 
                   debug=True)

HTML フォーム:

{% for messageview in messageview_list %}

<form method="post" action="/edit">
    <p>
        <textarea name="message" rows="3" cols="60" MAXLENGTH=60>
        {{ messageview.content }}</textarea>
        <br>
        <input type="submit" value="Update"/> 
      </p>
</form>
      {% ifnotequal error None %}
       <p>
       {{ error }}
       </p>
      {% endifnotequal %}
{% endfor %}
4

1 に答える 1

0

インデントはコピー/貼り付けが原因であると想定していますが、関数post()get()関数が実際にクラス内でインデントされていることを確認してください。

フォームには がありますが<textarea name="message" rows="3" cols="60" MAXLENGTH=60>、リクエスト内のキーワードを探している をdef post()使用しています。また、あなたの編集は、あなたがやりたいことをしているようには見えません。エンティティを編集するためのプロセスの基本的な概要は 1.) エンティティを取得します (同じように、いくつかのパラメーターを使用してクエリを実行します)。2.) 必要に応じてエンティティのプロパティを変更します。3.)エンティティをデータストアに戻します。updated_content = self.request.get('content')contentput()

あなたのコードから、データストアに入力された最後のエンティティを取得しているように見えますが、そのモデルを編集する代わりに新しいモデルを作成しています (それがあなたがやりたいことだと仮定します - それが正確かどうかはよくわかりません:))。返されるエンティティを変更しようとしている場合、これは機能するはずです。

def post(self):

    updated_content = self.request.get('message')
    content_query = db.GqlQuery("SELECT * "
                               "FROM MessageModel "
                               "ORDER BY date DESC LIMIT 1")

    # Your query will always return just one entity (due to the LIMIT),
    # but you can use get() here instead of fetch(1)
    latest_model = content_query.get()

    # Update the model's content property
    latest_model.content = updated_content
    latest_model.put()

    # Assuming you want to output that model, you'd output it now
    doRender(self,
             'edit.htm', 
             {'messageview_list': latest_model })
于 2012-10-29T13:15:32.403 に答える