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()andget()函数实际上是在您的类中缩进的。

在您的表单中,您有<textarea name="message" rows="3" cols="60" MAXLENGTH=60>,但在您def post()使用updated_content = self.request.get('content'),它正在寻找content请求中的关键字。此外,您的编辑看起来不像是在做您希望它做的事情。为了编辑实体,该过程的基本概述是 1.) 检索实体(照你做,使用一些参数查询);2.) 根据需要修改实体的属性;3.)put()实体回到数据存储区。

从您的代码中,您似乎正在检索输入数据存储区的最后一个实体,但随后创建了一个新模型而不是编辑该模型(假设这是您想要做的 - 不太确定这是否准确:))。如果您要修改返回的实体,这应该有效:

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 回答